使用re.findall匹配所有出现的字符串

时间:2016-08-22 15:34:57

标签: python regex

我有一个字符串

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?

2 个答案:

答案 0 :(得分:3)

虽然anubhava的表达有效,但请考虑使用对比原理(108步与30步相比 - 减少70%以上!):

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

请参阅hijacked demo on regex101.com 懒惰的圆点星在性能方面非常昂贵。

答案 1 :(得分:2)

将我的评论转换为答案:

您正在使用与前三位数匹配的贪婪.*到以大写字母开头的最后一个文本。

你应该让它变得非贪婪(懒惰):

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

RegEx Demo