使用regex查找两个字符串之间的所有匹配项

时间:2014-06-19 04:59:15

标签: python regex

我刚开始使用正则表达式,并且正在尝试使用它来解析HTML表格中的一些数据。我试图抓取<tr ></tr>标记之间的所有内容,然后再次生成类似的正则表达式以创建JSON数组。

我尝试使用它,但它只匹配第一组,而不是所有其他组。

<tr >(.*?)</tr>

如何找到这些标签之间的所有匹配项?

2 个答案:

答案 0 :(得分:1)

虽然使用正则表达式来完成这项工作是一个坏主意(有很多方法可以解决问题),但你的模式基本上是正确的。

使用Python返回所有匹配

然后问题就是在Python中返回所有匹配或捕获组。有两种基本方法:

  1. finditer
  2. 的findall
  3. 使用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])
    

答案 1 :(得分: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']