RegEx - 匹配可选组

时间:2011-01-09 04:29:47

标签: python regex html-parsing

我知道RegEx不是刮取HTML的最好方法,但这就是它...... 我有类似的东西:

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

我需要匹配写作和艺术部分。但并不是说他们在那里,而且可能还有墨水和铅笔等其他部分......

我该怎么做?我需要使用纯RegEx,没有额外的Python库。

5 个答案:

答案 0 :(得分:2)

也许有两种模式可以识别。

  1. 您的关键字位于&lt; td&gt; ...&lt; / td&gt;
  2. 您的关键字后跟&lt; a&gt; ...&lt; / a&gt;节
  3. 所以..首先提取&lt; td&gt; s中的所有内容......(伪代码)

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

    (.*?)表示非贪婪匹配,即匹配最小可能值。否则,您会匹配从第一个<td>最后一个 </td>(而不是下一个</td>)的所有内容。

    然后您可以继续处理inner部分!

答案 1 :(得分:1)

regex = re.compile("(\w+):")
regex.findall(yourString); // returns an array of matching elements

您可以对其进行测试here

PS:我强烈建议您通过this

答案 2 :(得分:1)

我最终创造了这个:

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

看起来它正在工作......也许它可以打磨一下。我知道你是首发。

答案 3 :(得分:0)

您可以使用?匹配正则表达式中的可选内容?在可选部分之后。 ?将匹配0或1次出现的子表达式。

答案 4 :(得分: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>

它看起来好像有效!

我真的很感谢有人检查并验证我的努力。