我认为我很了解正则表达式,但为什么这匹配'ccc'而不是'cccd'?
>>> mo = re.match('(c*)|(cccd)', 'cccd')
>>> mo.group(0)
'ccc'
这个特例是使用Python的re
模块。
答案 0 :(得分:4)
正则表达式模式从左到右进行评估。将优先级较高的模式放在第一位(在|
的左侧),将较低的优先级放在第二位(在|
的右侧)。请注意,不允许第二个模式匹配已与第一个模式匹配的文本。也就是说,默认情况下,正则表达式引擎不会进行重叠匹配。要使正则表达式引擎进行重叠匹配,您需要将模式放在捕获组中,然后再将捕获组置于正面的外观断言中(正向前瞻和正向后看)。
mo = re.match('(cccd)|(c*)', 'cccd')
答案 1 :(得分:1)
你的正则表达式((c*)|(cccd)
)说的是以下两种情况之一:
cccd
因为正则表达式是贪婪的,所以它使用ccc
字符串作为匹配,这就是你要返回的内容。它将首先尝试前所未有的(在这种情况下为c*
,如果它能够匹配,那么它将会。
要更正您想要的内容,请尝试使用正则表达式:(cccd)|(c*)
。有了这个:
>>> mo = re.match('(cccd)|(c*)', 'cccd')
>>> mo.group(0)
'cccd'
答案 2 :(得分:0)
(c*)
匹配'ccc',因此您就可以获得匹配。要匹配“cccd”,请使用^(?:(c*)|(cccd))$
请参阅demo。