1

我有个问题。可以说有这样的模式:

>>> 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”或两者组合开头并在这些字母之间结束的字符串,但仅此而已。还是我不明白?应该是这样吗?就像当你使用'|'时,它会忽略 {} 中的限制?有人可以解释一下吗?

4

2 回答 2

2

$分组影响。您的正则表达式被解释为(^a{1,2})|(x$),它匹配“字符串开头的一个或两个”或“字符串末尾的一个 x”。如果您只想将|apply 应用于 as 和 xs,则需要将它们分组:

pt = '^(a{1,2}|x)$'

或者,如果您不想捕获该组,请使用非捕获组:

pt = '^(?:a{1,2}|x)$'

编辑:我不确定我是否理解您要匹配的内容,但也许可以尝试:

pt = '^(a{1,2}x?|x)$"
于 2012-12-13T19:10:58.537 回答
2

^foo|bar$匹配^foobar$.

于 2012-12-13T19:11:40.477 回答