python-使用正则以某种顺序进行多个匹配项来报告



我正在尝试从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

这是您想要的吗?

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

如果是,只是不要告诉任何人,我的想法是将正则html使用。

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))

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

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

最新更新