我有一个字符串s='abc'。我期望以下正则表达式:
re.match(r"^(.*?)(b?)(.*?)$", s).groups()
..要与三个非空组匹配,分别是:
('a', 'b', 'c')
--因为模式的中间部分是贪婪的(b?)
。相反,只有最后一组是非空的:
('', '', 'abc')
我使用以下两种方式得到相同的结果:
re.match(r"^(.*?)(b?)(.*?)$", s).groups() #overt ^ and #
re.fullmatch("(.*?)(b?)(.*?)", s).groups() #fullmatch()
如果我将第一组设置为贪婪匹配,那么结果就是:
('abc', '', '')
我猜我会期望这样的结果,因为贪婪的
.*
在其他组看到它之前消耗了整个字符串。当然,我尝试构建的正则表达式比这更复杂,否则我可以从左右两边的组中排除
b
。re.match(r"^([^b]*?)(b?)([^b]*?)$", s).groups()
但在我的实际用例中,中间的组是一个几个字符长的字符串,其中任何一个都可能在左侧或右侧的组中单独显示,因此我不能仅从左侧或右侧组中排除这些字符。
我查看了其他标记为regex-greedy的问题,似乎没有一个能回答这个问题,尽管我怀疑ctwheels在python non-greedy match中的回复是我问题的原因(前两个组的可选性使得正则表达式引擎直到到达字符串的末尾才会失败,然后它只需要回溯一点就可以获得一个非失败的匹配)。
(.*?)
将匹配到可能匹配的下一个字符。(b?)
不匹配任何内容,这足以在第一个字符之前终止惰性匹配。第一个字符是空白。 - tdelaney