【问题标题】:Python - Using Regex to find multiple matches and report in a certain orderPython - 使用正则表达式查找多个匹配项并按特定顺序报告
【发布时间】:2018-08-09 01:52:11
【问题描述】:

我正在尝试从 HTML 源文件中提取一些行。下面的一个被简化了,但它的想法是一样的。使用下面的示例,我试图让它按数字顺序输出......即表格 1、表格 2、表格 3、表格 4。问题是第二个循环在第二轮重新开始。所以我得到:表格 1、表格 2、表格 3、表格 2。如何编辑以便第二个循环继续提取表格 4 文本?

代码

import re

line = 'bla bla bla<form>Form 1</form> some text...<form1>Form 
2</form1> more text?bla bla bla<form>Form 3</form> some text...
<form1>Form 4</form1> more text?'

for match in re.finditer('<form>(.*?)</form>', line, re.S):
  print match.group(1)
  for match1 in re.finditer('<form1>(.*?)</form1>', line, re.S):
    print match1.group(1)
    break

【问题讨论】:

标签: python regex loops break


【解决方案1】:

这是你想要的吗?

>>> for item in re.finditer(r'<form[12]?>([^<]+)',line):
...     item.groups()[0]
...     
'Form 1'
'Form 2'
'Form 3'
'Form 4'

如果是,请不要告诉任何人我的想法是对 HTML 使用正则表达式。

【讨论】:

    【解决方案2】:
    for match in re.finditer('<form1?>(.*?)</form1?>', line, re.S):
        print(match.group(1))
    

    我修改代码:

    for match in re.finditer('(<form>(.*?)</form>)|(<form1>(.*?)</form1>)', line, re.S):
        if None != match.group(4):
            print(match.group(4))
        else:
            print(match.group(2))
    

    【讨论】:

    • 这就是我正在使用的。但请注意,有两种模式...
      交替出现。所以问题是如何循环它们,以便按以下顺序搜索:、、、.
    • 是的,第一个代码有问题。我修改了代码。
    【解决方案3】:

    返回的match 对象有一个方法start,它获取所需组的索引并返回字符串中匹配组的起始索引(即line)。然后,您可以通过切片line(例如line[some_index:])让内部循环从该索引而不是line 的开头开始。 一个更合适和简单的方法是让你内心的re.finditermatch.group(1)而不是line

    但是,除非目标 HTML 的模式足够简单,否则手动处理 HTML 通常不是一个好主意。您可以使用一些易于使用且复杂的库来从 HTML 中解析和提取数据。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多