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解释说,重新搜索只返回第一个匹配项。 因此:

  • re.search(“\^*”,“abc^”).group()返回空字符串;i、 e.它匹配字符串开头插入符号的0倍,并返回
  • re.search('a*','abc^').group()在字符串开头匹配1
    a
    ,然后重新运行此
    a
  • re.search('b*','abc^').group()匹配空字符串的原因与插入符号相同(案例1)
  • 回答您的问题“如何将“^”与“*符号匹配?”
    您可以使用组
    (\ ^+*
    )并获得组的结果:

    re.search('(\^+)*','abc^^ab').group()
    

    正则表达式引擎从左到右解析输入字符串,因此,
    \^*
    匹配开始处的空字符串,并且
    re.search
    仅返回第一次出现的字符串


    在搜索某些内容时,应避免使用可能与空字符串匹配的模式,
    \^*
    是一种与0个或多个
    ^
    符号匹配的模式。因此,最好的解决方案是使用
    +
    而不是
    *

    字符串从左到右进行解析,因此,您的
    \^*
    匹配开始处的空字符串,并且
    重新搜索
    仅返回第一次出现的字符串。@WiktorStribiżew:Gr8!!!。使用
    re.search('a*','bca^').group()
    ,它还返回空字符串。引擎首先解析
    b
    字符,然后以零匹配退出该字符。谢谢:)所以,如果搜索的模式不是以第一个字符开头,星号将表现为非贪婪?
    *
    始终是贪婪的。然后看我的最重要的评论。可怜的我。很抱歉现在明白了。