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

时间:2015-03-21 18:06:41

标签: python regex

我认为我很了解正则表达式,但为什么这匹配'ccc'而不是'cccd'?

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

这个特例是使用Python的re模块。

3 个答案:

答案 0 :(得分:4)

正则表达式模式从左到右进行评估。将优先级较高的模式放在第一位(| 的左侧),将较低的优先级放在第二位(| 的右侧)。请注意,不允许第二个模式匹配已与第一个模式匹配的文本。也就是说,默认情况下,正则表达式引擎不会进行重叠匹配。要使正则表达式引擎进行重叠匹配,您需要将模式放在捕获组中,然后再将捕获组置于正面的外观断言中(正向前瞻和正向后看)。

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

答案 1 :(得分:1)

你的正则表达式((c*)|(cccd))说的是以下两种情况之一:

  1. 0或无限制的
  2. 文字序列cccd
  3. 因为正则表达式是贪婪的,所以它使用ccc字符串作为匹配,这就是你要返回的内容。它将首先尝试前所未有的(在这种情况下为c*,如果它能够匹配,那么它将会。

    要更正您想要的内容,请尝试使用正则表达式:(cccd)|(c*)。有了这个:

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

    示例在这里:https://regex101.com/r/aU8pE7/1

答案 2 :(得分:0)

(c*)匹配'ccc',因此您就可以获得匹配。要匹配“cccd”,请使用^(?:(c*)|(cccd))$

请参阅demo