[英]python regex matching between multiple lines and every other match
所以我已經玩了幾天,這就是我正在尋找的東西以及我現在擁有的正則表達式。 我有一個這種格式的文件(還有其他一些字段,但我省略了:
我只想匹配粗體
ADDR 1 - XXXXXX ADDR 1 - **XXXXXX**
ADDR 2 - XXXXXX ADDR 2 - XXXXXX
ADDR 1 - XXXXXX ADDR 1 - **XXXXXX**
ADDR 2 - XXXXXX ADDR 2 - XXXXXX
我編寫的正則表達式僅匹配第一個ADDR 1-XXXXX,但是我需要匹配所有粗體XXXXX的實例。
re.findall(r'ADDR 1- .*? ADDR 1-(.*?)(?=ADDR 2-)', lines, re.DOTALL)
有什么建議么? 我覺得我可能缺少一些簡單但不確定的東西。
碼:
import re
str= """
ADDR 1 - XXXXXX ADDR 1 - ABCDEF
ADDR 2 - XXXXXX ADDR 2 - XXXXXX
ADDR 1 - XXXXXX ADDR 1 - UVWXYZ
ADDR 2 - XXXXXX ADDR 2 - XXXXXX
"""
m = re.findall(r".*ADDR\s+1\s+-\s+(.*)",str)
print m
輸出:
C:\Users\dinesh_pundkar\Desktop>python c.py
['ABCDEF', 'UVWXYZ']
C:\Users\dinesh_pundkar\Desktop>
這個怎么運作:
.*ADDR\s+1\s+-\s+(.*)
讓我們排隊-ADDR 1-XXXXXX ADDR 1-ABCDEF
.*ADDR
將匹配ADDR 1-XXXXXX ADDR 。 由於.*
匹配任何內容,並且正則表達式本質上是貪婪的,所以要停止,我必須在.*
之后添加ADDR
\\s+1\\s+-\\s+(.*)
將匹配其余的1-ABCDEF 。 \\s+1\\s+-\\s+
是必需的,因為我們需要匹配ADDR 1而不是ADDR 2 。 (.*)
將匹配ABCDEF並將其存儲。 如果要捕獲某個事物的所有其他實例,則對字符串進行拆分或切片將比使用regex 快得多 -以下示例展示了一個非常基本的示例:
split()方法:
>>> [i.split('ADDR 1 - ')[-1] for i in s.split('\n')[::2]]
>>> ['AXXXXZ', 'AXXXXY']
>>> ''' 18.3057999611 seconds - 10000000 iterations '''
findall()方法:
>>> re.findall(".*ADDR\s+1\s+-\s+(.*)", s)
>>> ['AXXXXZ', 'AXXXXY']
>>> ''' 77.5003650188 seconds - 10000000 iterations '''
如果您知道regex並非絕對必要,請考慮使用替代方法。 同樣,可以對接受的答案中顯示的正則表達式進行優化,以將時間縮短近一半(例如re.findall("ADDR 1 .+ - (.+)", s
) 37.0185003658 seconds - 10000000 iterations
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.