簡體   English   中英

Python:如何使用正則表達式獲取所有可能的匹配項

[英]Python:How to get all possbile matches with regex

我試圖在括號之間找到文本,但我想要這樣的東西

 s="( abc (def) kkk ( mno) sdd ( xyz ) )"
 p=re.findall(r"\(.*?\)",s)
    for i in p:
        print(i)

輸出:

( abc (def) ,
( mno),
( xyz )

預期的:

( abc (def) ,
( abc (def) kkk ( mno) ,
( abc (def) kkk ( mno) sdd ( xyz ) ,
( abc (def) kkk ( mno) sdd ( xyz ) ) ,
(def) ,
(def) kkk ( mno)  ,
(def) kkk ( mno) sdd ( xyz ) ,
(def) kkk ( mno) sdd ( xyz ) ) ,
( mno) ,
( mno) sdd ( xyz ) ,
( mno) sdd ( xyz ) ) ,
( xyz ) ,
( xyz ) ) 

python regex 模塊不處理重疊匹配。 通過在文本中查找()的位置,為開始/結束值創建合理的元組並分割字符串,更容易獲得:

使用enumerate(iterable)collections.defaultdict()itertools.product()

s="( abc (def) kkk ( mno) sdd ( xyz ) )"

# get positions of all opening and closing ()
from collections import defaultdict
d = defaultdict(list)
print(d)

for idx,c in enumerate(s):
    if c in "()":
        d[c].append(idx)

# combine all positions 
from itertools import product
pos = list(product (d["("],d[")"]))
print(pos)

# slice the text if start < stop+1 else skip
for start,stop in pos:
    if start < stop+1:
        print(s[start:stop+1])

輸出:

# d
defaultdict(<class 'list'>, {'(': [0, 6, 16, 27], ')': [10, 21, 33, 35]})

# pos
[(0, 10), (0, 21), (0, 33), (0, 35), (6, 10), (6, 21), (6, 33), (6, 35), 
 (16, 10), (16, 21), (16, 33), (16, 35), (27, 10), (27, 21), (27, 33), (27, 35)]

# texts from pos
( abc (def)
( abc (def) kkk ( mno)
( abc (def) kkk ( mno) sdd ( xyz )
( abc (def) kkk ( mno) sdd ( xyz ) )
(def)
(def) kkk ( mno)
(def) kkk ( mno) sdd ( xyz )
(def) kkk ( mno) sdd ( xyz ) )
( mno)
( mno) sdd ( xyz )
( mno) sdd ( xyz ) )
( xyz )
( xyz ) )

暫無
暫無

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

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