我有一个问题。让我们说有这样的模式:
>>> import re
>>> pt ='^a{1,2}$'
>>> re.search(pt, 'aa') # looks ok
<_sre.SRE_Match object at 0x020B2288>
>>> re.search(pt, 'aaa') # ok too
>>>
现在让我们尝试寻找与其他模式的匹配:
>>> pt = '^a{1,2}|x$'
>>> re.search(pt, 'a') # this one looks ok
<_sre.SRE_Match object at 0x020B25D0>
>>> re.search(pt, 'aaax') # (1) Now this one?
<_sre.SRE_Match object at 0x020B2288>
>>> re.search(pt, 'aaaaaax') # (2) and this one?
<_sre.SRE_Match object at 0x020B25D0>
>>> re.search(pt, 'aaa') # (3) and this one?
<_sre.SRE_Match object at 0x020B25D0>
(1)(2)(3)对我而言,它看起来应该匹配以一个或两个'a'或一个'x'开头的字符串或两个组合之间的字符串结尾,但没有别的。或者我不明白吗?它应该是那样的吗?就像你使用'|'时一样,它会忽略{}内的限制? 有人可以解释一下吗?
答案 0 :(得分:2)
$
会受到分组的影响。你的正则表达式被解释为(^a{1,2})|(x$)
,它匹配“字符串开头的一个或两个”或“字符串末尾的x”。如果您希望|
仅适用于as和xs,则需要对它们进行分组:
pt = '^(a{1,2}|x)$'
或者,如果您不想捕获该组,请使用非捕获组:
pt = '^(?:a{1,2}|x)$'
编辑:我不确定我理解你想要匹配的内容,但也许可以尝试:
pt = '^(a{1,2}x?|x)$"
答案 1 :(得分:2)
^foo|bar$
匹配^foo
或bar$
。