正则表达式 - 匹配可选组

2 投票
5 回答
1784 浏览
提问于 2025-04-16 09:39

我知道正则表达式(RegEx)并不是抓取HTML的最佳方法,但我现在就是要用它...

我有一些类似这样的内容:

<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a>  Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td>

我需要匹配“Writing”和“Art”这两个部分。但是并没有说明它们一定会出现,可能还有其他部分,比如“Ink”和“Pencils”之类的...

我该怎么做呢?我需要使用纯正则表达式,不想用额外的Python库。

5 个回答

1

我最终做出了这个:

(Art:|Pencils:|Ink:|Writing:){0,4}.<a href="creator\.php\?c=[^">]*?\"\>(?P<Name>.*?)\</a\>

看起来是可以工作的……也许还可以再优化一下。我还是个新手,你知道的。

2

可能有两种模式需要识别。

  1. 你的关键词出现在一个 <td>...</td> 标签里面
  2. 你的关键词后面跟着一个 <a>...</a> 部分

所以,首先要提取所有在 <td> 标签里的内容……(伪代码)

while ( match( "<td[^>]*>(.*?)</td[^>]*>" ) ) {
    inner = match[1];
    ...
}

这里的 (.*?) 是指非贪婪匹配,也就是说,它会尽量匹配最少的内容。否则的话,你可能会把从第一个 <td> 到最后一个 </td> 之间的所有内容都匹配上(而不是到下一个 </td>)。

然后你就可以继续处理里面的内容了!

0

尽管我之前的回答是这样,但我改变主意了,我希望不要有选项或替代方案,而是把所有内容都获取到。这意味着,无论在TD标签里面有什么内容,都必须被捕获并正确分类。

我需要创建一个可选的捕获组,这样无论布局是什么,我都能获取到内容。

这个应该可以用这个来实现,也就是:

<td>   Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td>
<td> Writing: <a href="creator.php?c=CCh">Carlo Chendi</a>  Art: <a href="creator.php?c=LBo">Luciano Bottaro</a> </td>
<td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td>  Pencils: <a href="creator.php?c=JB">Jack Bradbury</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td> Writing: <a href="creator.php?c=BKa">Bob Karp</a> Pencils: <a href="creator.php?c=AT">Al Taliaferro</a> Ink: <a href="creator.php?c=AH">Al Hubbard</a> </td>    
<td> Writing: <a href="creator.php?c=DKi">Dick Kinney</a> Pencils: <a href="creator.php?c=TS">Tony Strobl</a> Ink: <a href="creator.php?c=SSt">Steve Steere</a> </td>
<td> Writing: <a href="creator.php?c=VLo">Vic Lockman</a>  Art: <a href="creator.php?c=KWr">Kay Wright</a> </td>
<td> Writing: <a href="creator.php?c=MGa">Michele Gazzarri</a>  Art: <a href="creator.php?c=GPe">Giuseppe Perego</a> </td>

我创建了:

<td>\ {1,3}(?:(?:Writing: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>).*?)?(?:(?:Pencils: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>\ ))?(?:(?:Ink: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?(?:(?:Art: <a href="creator\.php\?c=[^>"]*?">(.*?)?</a>))?\ {1,3}</td>

看起来是有效的!

如果有人能帮我检查一下,验证我的努力,我会非常感激。

撰写回答