簡體   English   中英

多行之間的python正則表達式匹配以及其他所有匹配

[英]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+(.*)

正則表達式可視化

Debuggex演示

讓我們排隊-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 .+ - (.+)", s37.0185003658 seconds - 10000000 iterations

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM