python re,多个匹配组

2024-04-26 21:25:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串:

s = '&nbsp;<span>Mil<\/span><\/th><td align=\"right\" headers=\"Y0 i7\">112<\/td><td align=\"right\" headers=\"Y1 i7\">113<\/td><td align=\"right\" headers=\"Y2 i7\">110<\/td><td align=\"right\" headers=\"Y3 i7\">107<\/td><td align=\"right\" headers=\"Y4 i7\">105<\/td><td align=\"right\" headers=\"Y5 i7\">95<\/td><td align=\"right\" headers=\"Y6 i7\">95<\/td><td align=\"right\" headers=\"Y7 i7\">87<\/td><td align=\"right\" headers=\"Y8 i7\">77<\/td><td align=\"right\" headers=\"Y9 i7\">74<\/td><td align=\"right\" headers=\"Y10 i7\">74<\/td><\/tr>'

我想从字符串中提取这些数字:

112 113 110 107 105 95 95 87 77 74 74

我不是正则表达式方面的专家,所以有人能告诉我,为什么它不返回任何匹配项:

p = re.compile(r'&nbsp;.*(>\d*<\\/td>.*)*<\\/tr>')
m = p.match(s)

我确信有一个html/xml解析模块可以解决我的问题,我也可以拆分字符串并处理输出,但是我真的想用re模块来完成。谢谢!你知道吗


Tags: 模块字符串rightretrtdheadersspan
3条回答

所有需要的数字都在“>;”和“<;”之间。所以,你可以这样做:

re.findall(">(\d+)<", s)

输出:

['112', '113', '110', '107', '105', '95', '95', '87', '77', '74', '74']

基本上,它的意思是获取所有在“>;”和“<;”之间的数字流。然后,使用set,您只能得到唯一的。你知道吗

其他答案给出了正则表达式,但值得理解的是为什么你的正则表达式不起作用

所有匹配项都是贪婪的和可选的(*)。所以你的正则表达式说:

  • &nbsp;
  • 任何内容的0个或多个字符
  • 0次或多次出现您的捕获组
  • </tr>

“任何内容的0个或多个字符”会吃掉字符串的其余部分,不会给捕获组留下任何内容,而且由于它是可选的,因此成功匹配。你知道吗

如果您想重新设计正则表达式以使其正常工作,您应该使用.*?而不是.*来匹配字符串开头的垃圾。?使匹配非reedy,因此它将匹配尽可能少的字符,而不是尽可能多的字符。你知道吗

>>> r = re.compile(r'headers="Y\d+ i\d+">(\d+)<\\/td>')
>>> r.findall(s)
['112', '113', '110', '107', '105', '95', '95', '87', '77', '74', '74']
>>> 

相关问题 更多 >