使用正则表达式查找两个字符串之间的所有匹配项

1 投票
2 回答
930 浏览
提问于 2025-04-18 10:19

我刚开始使用正则表达式(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中返回所有的匹配项或捕获组。主要有两种方法:

  1. finditer
  2. 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])

撰写回答