使用正则表达式查找两个字符串之间的所有匹配项
我刚开始使用正则表达式(regex),现在想用它来解析一些HTML表格中的数据。我想抓取所有在<tr >
和</tr>
标签之间的内容,然后再用类似的正则表达式来创建一个JSON数组。
我试过这样做,但它只匹配到了第一个组,而没有匹配到后面的内容。
<tr >(.*?)</tr>
我该怎么做才能找到这些标签之间的所有匹配项呢?
2 个回答
0
对我来说是有效的,也许你需要使用 findall
,或者可能你没有使用原始字符串?
import re
txt = '''<tr >foo</tr><tr >bar
</tr>
<tr >baz</tr>'''
# Be sure to use the DOTALL flag so the newlines are matched by the dot as well.
re.findall(r'<tr >(.*?)</tr>', txt, re.DOTALL)
返回结果是
['foo', 'bar\n\n', 'baz']
1
虽然用正则表达式来做这个事情不是个好主意(因为有很多地方可能出错),但你的模式基本上是对的。
在Python中返回所有匹配项
接下来要讨论的是如何在Python中返回所有的匹配项或捕获组。主要有两种方法:
- finditer
- findall
使用finditer
for match in regex.finditer(subject):
print("The Overall Match: ", match.group(0))
print("Group 1: ", match.group(1))
使用findall
findall
有点奇怪。当你有捕获组时,如果想同时获取捕获组和整体匹配的结果,你需要把原来的正则表达式用括号括起来(这样整体匹配也会被捕获)。在你的例子中,如果你想同时获取标签外部和内部的内容(你用组1捕获的内容),你的正则表达式应该变成:(<tr >(.*?)</tr>)
。然后你可以这样做:
matches = regex.findall(subject)
if len(matches)>0:
for match in matches:
print ("The Overall Match: ",match[0])
print ("Group 1: ",match[1])