[英]Python - Using Regex to find multiple matches and report in a certain order
我正在嘗試從HTML源文件中提取一些行。 下面的一個被簡化,但是是相同的想法。 使用下面的示例,我試圖使其以數字順序輸出...即表格1,表格2,表格3,表格4。問題是第二個循環在第二輪重新開始。 這樣我得到:Form 1,Form 2,Form 3,Form2。如何進行編輯,以便第二個循環繼續提取Form 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 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
(如line[some_index:]
)。 一種更合適,更簡單的方法是只讓您的內部re.finditer
使用match.group(1)
而不是line
。
但是,除非目標HTML的模式足夠簡單,否則手動處理HTML通常不是一個好主意。 您可以使用一些易於使用的高級庫來解析和提取HTML中的數據。
這是你想要的嗎?
>>> for item in re.finditer(r'<form[12]?>([^<]+)',line):
... item.groups()[0]
...
'Form 1'
'Form 2'
'Form 3'
'Form 4'
如果是這樣,請不要告訴任何人,將正則表達式用於HTML是我的主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.