2016-08-22 48 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