我对Python的问题有疑问操作者:
以下正则表达式,其中我在|的选项中使用多个字符运算符给出了预期的结果:
>>> ps = "^[23|45]"
>>> p = re.compile(ps)
>>> p.match("23")
<_sre.SRE_Match object at 0x0000000001EE0370>
另外,当我在|:
中使用1个字符的选项时,我可以添加字符串结尾符号>>> ps = "^[2|4]$"
>>> p = re.compile(ps)
>>> p.match("2\n")
<_sre.SRE_Match object at 0x0000000001EE0440>
但是当我尝试在|中使用多字符选项时我没想到匹配的比赛:
>>> ps = "^[23|45]$"
>>> p = re.compile(ps)
>>> p.match("23\n")
>>> ps = "^[2|4]$"
另外,我尝试使用&#34; \ n&#34;字符而不是&#34; $&#34;,&#34;搜索&#34; -method而不是&#34;匹配&#34;,但无济于事。 如何使最后一个正则表达式起作用?
答案 0 :(得分:1)
^[23|45]$
将匹配给定列表中的单个字符,即匹配2或3或|
或4
或5
。 Anchors断言该行必须只有一个字符。所以这将匹配我之前提到的只有一个字符的所有行。
此$
字符之前还存在\n
。所以这个re.match(r'^[2|3]$', '2\n')
会给你一个匹配。
>>> ps = "^[23|45]"
>>> p = re.compile(ps)
>>> p.match("23")
<_sre.SRE_Match object at 0x0000000001EE0370>
上面的代码会给你一个匹配,因为^
起始锚,[23|45]
给定列表中的任何一个字符。我们的输入为23
,因此它与第一个2
匹配,最后它会为您提供匹配,并请注意,这不会与整个文本23
匹配。要匹配字符串23
或45
,您必须将模式包含在捕获或非捕获组中,而不是在字符类中。
r"^(23|45)$"
答案 1 :(得分:0)
在{23 | 45] |
内[]
内无用,并且充当|
而不是or
运算符的掌控者。
请改用(?:23|45)
。
此外,[23]
将匹配2
,3
。内部字符类中的sequnce无关紧要。
第一个示例适用于字符类[23|45]
,因此2 or 3
将匹配(此处仅2
匹配。如果您使用^[23|45]$
,则无法获得匹配项。第三个不匹配,因为\n
不在字符类中。