正则表达式匹配模式而不是最小长度而不是期望的最大值

时间:2017-03-30 08:29:32

标签: python regex string parsing text

以下代码作为示例返回'ol',目标是返回单词'cool'

import re
re.search( r'.*([a-z]{2,}).*', 'this is very cool').group(1)

也就是说,正则表达式匹配"至少2个字符"并没有检查是否可以匹配更多。如何让正则表达式匹配最大可能的字符数而不是最小值?

也就是说,如何实现'cool'的输出?

1 个答案:

答案 0 :(得分:1)

你得到ol的原因是你的模式中的初始.*一次抓取整个字符串,然后发生回溯以适应后续的子模式。当ol被释放时,"从抓取的文本中,[a-z]{1,2}匹配子字符串,正则表达式引擎每天调用它并返回匹配(尾随.*在这里不重要。)

您可以使用单词边界来确保.*回溯到以2个小写字母开头的最后一个单词的开头,并且可能有更多:

.*\b([a-z]{2,})

请参阅regex demo

Python demo

import re
rx = r".*\b([a-z]{2,})"
s = "this is very cool"
m = re.search(rx, s)
if m:
    print(m.group(1))
# => cool