2011-01-09 189 views
2

我知道正则表达式是不是刮HTMLS的最佳途径,但是这是它... 我有一些类似:正则表达式 - 匹配可选组

<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

这不是“不是最好的方式”,它不是一种方式。如果我要求你用面条钉钉子,那么完成它的失败是我的错,而不是你的。 – msw 2011-01-09 04:41:55

+0

是的,没错。不会这样做,如果我不会以某种方式被迫这样做...除非你有一个关于如何阅读一个HTML没有额外的库在Python的建议... – Maurizio 2011-01-10 11:15:46

+0

对不起,并不意味着听起来刺耳。 ..我真的不需要阅读所有的标签,只是一些特定的标签,所以我认为这可以做到......我可能是错的,尽管...谢谢! – Maurizio 2011-01-10 11:24:20

回答

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> 

而且看起来它是工作!

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

0

你可以用正则表达式匹配可选的东西吗?之后的可选部分。 ?将匹配0或1次子表达式。

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

您可以测试它here

PS:我强烈建议你去通过this

1

我创造了这个最后:

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

,看起来像它的工作..也许它可以被打磨一下。我是你知道的首发。

2

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

  1. 您的关键字< TD> ... </TD>
  2. 关键字后面是一个<> ... </A>部分

所以..第一内<提取一切TD>取值...(伪码)

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

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

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