在Python中将可选的完整字符串与regex匹配

2024-09-28 22:38:10 发布

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

我已经看过HOWTO和re模块文档好几次了,我仍然对Python regex中的可选性和分组如何交互感到困惑。我想要的是匹配组内的所有内容,或者根本不匹配,但是我发现子字符串是匹配的。下面是一个最小的例子:

>> re.compile(r"(test)?").search("tes")
<_sre.SRE_MATCH at 0xBlahBlah>

我希望匹配,因为我将整个字符串test标记为可选。我不明白什么(部分文件)??在

下面是一个更接近我实际感兴趣的问题:

^{pr2}$

为什么空白没有被强制匹配?在

编辑2017-01-04 到目前为止的答案是有帮助的,但我认为我没有足够清楚地解释我的需要。在

简而言之,我想要一个正则表达式,它将匹配foo或{}(全部)或{}或{}(全部匹配),而不匹配其他内容。在

>> m = re.compile("(foo|bar)(\sbaz)?")
>> m.search("foo ba")
<_sre.SRE_Match as 0xBlahblah>
>> m.search("foo ba").span()
(0, 3)

所以我看到发生的是它在foo上匹配,然后不关心下游的情况。如何使它只在baz上匹配或根本不匹配?在


Tags: 模块字符串文档testre内容searchfoo
3条回答

让我们看看匹配的是什么:

import re
m = re.compile(r"(test)?").search("tes")
m.span()
# have (0, 0)

它是空字符串。为什么?在

因为?这里的意思是零次或一次(就像{0, 1})。所以第一组可以匹配字符串test或空字符串(我们有)。在

以下是docs中的一句话:

'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE. ab? will match either ‘a’ or ‘ab’.

对于这两种情况下的?,您是说您希望组中出现0次或1次。所以在"(test)?"中,要么将“test”与“not match”匹配,或者一个空字符串,这将是字符串的第一部分。在

在第二个例子中,"(distance|mileage)(\sbetween)?"你有四个匹配的“distance”、“miliety”或“distance between”或“milegeries between”。在

但这些都不必是整个字符串,所以可以在测试之前或之后进行测试。否则,如果只希望开始,则需要^regex,或者{}只匹配结尾,或者最后^regex$只匹配整个字符串。在

对于你所描述的,我认为你不想使用可选匹配。我想你想要的是你拥有的正则表达式,但是没有?。在

对于第一个例子:

>>> re.compile(r"(test)").search("tes")
>>> re.compile(r"(test)").search("test")
<_sre.SRE_Match object at 0x104c64210>
>>> re.compile(r"(test)").search("testing")
<_sre.SRE_Match object at 0x104c64198> 

对于第二个例子:

^{pr2}$

相关问题 更多 >