使用“or”时Python re模块重复符号限制

2024-03-29 10:49:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个问题。假设有这样的模式:

>>> 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”开头的字符串,或者两个字母的组合,以及这些字母之间的结尾,而不是别的。或者我不明白?应该是这样吗?就像使用“|”时,它忽略了{}中的限制? 有人能给我解释一下吗?你知道吗


Tags: andreptsearchobjectmatch字母ok
2条回答

^foo|bar$匹配^foobar$。你知道吗

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

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

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

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

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

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

相关问题 更多 >