Python 为什么`(c*)|(cccd)`匹配'ccc',而不是'cccd`?

Python 为什么`(c*)|(cccd)`匹配'ccc',而不是'cccd`?,python,regex,Python,Regex,我原以为我对正则表达式理解得很好,但为什么这个匹配的是“ccc”,而不是“cccd” >>> mo = re.match('(c*)|(cccd)', 'cccd') >>> mo.group(0) 'ccc' 此特定案例使用Python的re模块。(c*)匹配“ccc”,因此您得到了匹配。要匹配“cccd”,请使用^(?(c*)|(cccd))$ 请参阅。(c*)匹配“ccc”,这样您就得到了匹配。要匹配“cccd”,请使用^(?(c*)|(cccd))$

我原以为我对正则表达式理解得很好,但为什么这个匹配的是“ccc”,而不是“cccd”

>>> mo = re.match('(c*)|(cccd)', 'cccd')
>>> mo.group(0)
'ccc'
此特定案例使用Python的
re
模块。

(c*)
匹配“ccc”,因此您得到了匹配。要匹配“cccd”,请使用
^(?(c*)|(cccd))$

请参阅。

(c*)
匹配“ccc”,这样您就得到了匹配。要匹配“cccd”,请使用
^(?(c*)|(cccd))$

请参阅。

您的正则表达式(
(c*)|(cccd)
)表示匹配以下两个内容之一:

  • 0或无限制的c
  • 文本序列
    cccd
  • 因为正则表达式是贪婪的,所以它使用
    ccc
    字符串作为匹配项,所以这就是返回的内容。它将首先尝试最先出现的内容(在本例中是
    c*
    ),如果它能够匹配,那么它会

    要更正所需内容,请尝试正则表达式:
    (cccd)|(c*)

    >>> mo = re.match('(cccd)|(c*)', 'cccd')
    >>> mo.group(0)
    'cccd'
    
    示例如下:

    您的正则表达式(
    (c*)|(cccd)
    )表示匹配两件事之一:

  • 0或无限制的c
  • 文本序列
    cccd
  • 因为正则表达式是贪婪的,所以它会使用
    ccc
    字符串作为匹配项,这就是您要返回的内容。它将首先尝试任何最先出现的内容(在本例中为
    c*
    ,如果它能够进行匹配,那么它会

    要更正所需内容,请尝试正则表达式:
    (cccd)|(c*)

    >>> mo = re.match('(cccd)|(c*)', 'cccd')
    >>> mo.group(0)
    'cccd'
    

    示例如下:

    正则表达式模式从左到右求值。将优先级较高的模式放在第一位(在
    |
    的左侧),优先级较低的模式放在第二位(在
    |
    的右侧)。请注意,不允许第二个模式与已与第一个模式匹配的文本匹配。也就是说,默认情况下,正则表达式引擎不会进行重叠匹配。若要使正则表达式引擎进行重叠匹配,则需要将您的模式放入捕获组中,然后再次将捕获组放入正向环视中,如下所示选择(正向前瞻和正向后顾)


    正则表达式模式从左到右求值。将优先级较高的模式放在第一位(在
    的左侧),优先级较低的模式放在第二位(在
    的右侧)。请注意,不允许第二个模式与已与第一个模式匹配的文本匹配。也就是说,默认情况下,正则表达式引擎不会进行重叠匹配。若要使正则表达式引擎进行重叠匹配,则需要将您的模式放入捕获组中,然后再次将捕获组放入正向环视中,如下所示选择(正向前瞻和正向后顾)


    在这种特殊情况下,您可以简单地恢复顺序:
    '(cccd)|(c*)”
    。正则表达式从左到右求值。在这种特殊情况下,您可以简单地恢复顺序:
    '(cccd)|(c*)“
    。正则表达式是从左到右计算的。确切地说,第一个正则表达式会被满足,因此第二个将变得不相关。我想我的困惑是贪婪和最长匹配。确切地说,第一个正则表达式会被满足,因此第二个将变得不相关。我想我的困惑是贪婪和最长匹配。