使用Python正则表达式在字符串中匹配一个管道符号

3

我正在尝试使用Python正则表达式匹配字符串中的管道字符,但似乎无法匹配上。我已将其简化为以下版本。

假设我要在字符串中查找序列z|a。以下是一些可能的正则表达式和结果:

>>> import re
>>> re.match(r'|', 'xyz|abc')
<_sre.SRE_Match object at 0x2d9a850>
>>> re.match(r'z|', 'xyz|abc')
<_sre.SRE_Match object at 0x2d9a780>
>>> re.match(r'|a', 'xyz|abc')
<_sre.SRE_Match object at 0x2d9a850>
>>> re.match(r'z|a', 'xyz|abc')
>>> re.match(r'z\|a', 'xyz|abc')
>>> re.match(r'z\\|a', 'xyz|abc')
>>> re.match(r'z\\\|a', 'xyz|abc')
>>> re.match(r'z[|]a', 'xyz|abc')
>>> 

我可以匹配 |, |az|,但是我找不到一种方法来匹配 z|a。有什么想法吗?


使用双引号而不是单引号行不通吗? - jaypal singh
2个回答

6

re.match()是在字符串开头查找匹配项。请改用re.search()

你所匹配的模式正在匹配空字符串,例如r'|'表示空字符串或空字符串,r'z|'表示z或空字符串,'|a'表示空字符串或a。这些都会在任何字符串上匹配。

>>> re.match('z\\|a', 'xyz|abc')
>>> re.search('z\\|a', 'xyz|abc')
<_sre.SRE_Match object at 0x02BF2BB8>
>>> re.search(r'z\|a', 'xyz|abc')
<_sre.SRE_Match object at 0x02BF2BF0>

更一般地说,您可以在需要将文字字符串包含在更复杂的正则表达式中间时使用re.escape(),以避免不必要地计算需要取消转义的反斜杠数量。


1
啊,谢谢 - 我应该自己意识到匹配/搜索问题。如果我能给的话,re.escape()会得到额外的奖励分数。 - Hamish Downer
感谢您的回答@Duncan。为什么'z\\|a''z\|a'表达式返回相同的结果?在表达式解析后,'z\\|a'-> 'z\|a''z\|a'-> 'z|a',因此它们不应该产生相同的search()结果。请纠正我哪里错了。 - CᴴᴀZ
@CᴴᴀZ 'z\\|a''z\|a' 是完全相同的字符串。在字符串中,\| 不是有效的 Python 转义序列,因此 Python 只将其视为两个字符。 - Duncan
谢谢 @Duncan,我已经搞定了。我把步骤分解为: string parse(查找转义序列)-> regex parsez\\|a 在字符串解析后评估为 z\|a,如您所述,z\|a 评估为 z\|a\| 不是有效的转义序列)。由于“string parse”后的结果在两种情况下都相同,因此结果也是相同的。 - CᴴᴀZ

-1
您可以使用以下方法使re.match匹配字符串的中间部分。
myPattern = "how"

re.match('(.)*(%s)' %myPattern, 'Hello, how are you ?')*

. 在正则表达式中匹配任何字符。基本上,您要求匹配跳过任何数量的字符以匹配您的模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接