2016-08-22 50 views
1

串的出現次數我有一個字符串比賽全部採用re.findall

a = "123 some_string ABC 456 some_string DEF 789 some_string GHI"

print re.findall("(\d\d\d).*([A-Z]+)", a) 

O/P[('123', 'I')]

預期的O/P[('123', 'ABC'), ('456', 'DEF'), ('789', 'GHI')]

由於.*它我匹配123和最終字符I。 什麼是正確的正則表達式,以便它打印預期的o/p?

+3

使它不貪婪:['(\ d {3})。*?([AZ] +)'](https://regex101.com/r/oL1lR1/1) – anubhava

+3

@anubhava發表回答。 – Bakuriu

+1

@ anubhava感謝它工作:) – Naive

回答

3

雖然anubhava的表情的作品,可以考慮使用的對比原則(相比於30步108步 - 減少由多比70%!):

(\d{3})[^A-Z]*([A-Z]+) 

查看hijacked demo on regex101.com
懶惰的小星星在性能方面非常昂貴。

+1

考慮到目前的要求,這是一個更好的選擇。如果上限部分的數量有限制,那麼就需要一個溫和的貪婪標記。 –

2

轉換我的評論一個答案:

您正在使用貪心.*是匹配前3位號碼開頭大寫字母最後文本。

你應該讓非貪婪(懶惰):

(\d{3}).*?([A-Z]+) 

RegEx Demo