2016-01-15 20 views
0

我們假設我們有一個正則表達式exp,並希望在字符串s中查找此模式的所有匹配項。這可以很容易地完成與檢索與re.findall不匹配的子字符串

import re 
m=re.findall(exp,s) 

但現在我們還想要所有的匹配之間的子串。

問題的第一部分是:什麼是最好/最簡單的方法來做到這一點?

問題的第二部分是:是否有可能獲得比賽中,中間人通過串s一次掃描,也就是沒有正則表達式匹配的兩倍?

+0

爲什麼不使用're.split'?而且不要在1次手術中這樣做。正則表達式旨在匹配,而不是*不匹配*。 –

回答

1

在第一部分,我認爲re.split作品這樣的:

>>> re.split("a(?=b)", "ababba") 
['', 'b', 'bba'] 

作爲解決方案的第2部分,我想你也許能夠做這樣的事情:

exp2 = re.compile(exp) 
unmatched = [] 
prev_match_end = 0 
for match in exp2.finditer(s): 
    unmatched.append(s[prev_match_end: match.start()]) 
    prev_match_end = match.end() 

# Deal with unmatched text after last match: 
unmatched.append(s[prev_match_end:]) 

現在你有所有的比賽和無與倫比的文字。

+0

謝謝!對於我沒有想到的問題的第一部分來說,這是一個簡單而優雅的解決方案。但我真的很想削減第二輪掃描... – ead

+0

@ead我想我已經解決了第二部分。 – bigblind

+0

真棒,那正是我一直在尋找的!萬分感謝! – ead