Python 为什么插入符号在regexp中与星号一起使用时表现得不贪婪
我们都知道,Python 为什么插入符号在regexp中与星号一起使用时表现得不贪婪,python,regex,regex-greedy,Python,Regex,Regex Greedy,我们都知道,*表示0或更多,除非与非贪婪运算符(如?)一起使用,否则它总是尽可能地贪婪 >>> re.search('.*hello','hai hello there, hello again').group() 'hai hello there, hello' >>> re.search('.*?hello','hai hello there, hello again').group() 'hai hello' 我只是偶然发现了以下代码,并对其行为感到惊
*
表示0或更多,除非与非贪婪运算符(如?
)一起使用,否则它总是尽可能地贪婪
>>> re.search('.*hello','hai hello there, hello again').group()
'hai hello there, hello'
>>> re.search('.*?hello','hai hello there, hello again').group()
'hai hello'
我只是偶然发现了以下代码,并对其行为感到惊讶
>>> re.search('\^*','abc^').group()
''
>>> re.search('a*','abc^').group()
'a'
对于模式\^*
,我希望它与字符串中的一个插入符号匹配
但是,为什么它必须表现得不贪婪,退出时插入符号为0,空字符串匹配
这是因为^
对正则表达式是特殊的吗?如果是这样,那么我们如何将^
与*
符号匹配
注意:当然,使用
\^+
作为模式,它将明显匹配文字插入符号 @Wiktor Stribiżew解释说,重新搜索只返回第一个匹配项。
因此:
a
,然后重新运行此a
您可以使用组
(\ ^+*
)并获得组的结果:
re.search('(\^+)*','abc^^ab').group()
正则表达式引擎从左到右解析输入字符串,因此,
\^*
匹配开始处的空字符串,并且re.search
仅返回第一次出现的字符串
在搜索某些内容时,应避免使用可能与空字符串匹配的模式,
\^*
是一种与0个或多个^
符号匹配的模式。因此,最好的解决方案是使用+
而不是*
字符串从左到右进行解析,因此,您的\^*
匹配开始处的空字符串,并且重新搜索
仅返回第一次出现的字符串。@WiktorStribiżew:Gr8!!!。使用re.search('a*','bca^').group()
,它还返回空字符串。引擎首先解析b
字符,然后以零匹配退出该字符。谢谢:)所以,如果搜索的模式不是以第一个字符开头,星号将表现为非贪婪?*
始终是贪婪的。然后看我的最重要的评论。可怜的我。很抱歉现在明白了。