我正在尝试使用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')
>>>
所以我可以与|
,|a
和z|
匹配,但我找不到匹配z|a
的方法。有什么想法吗?
答案 0 :(得分:4)
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 :(得分:0)
您可以使用以下方法让re.match
匹配字符串的中间部分。
myPattern = "how"
re.match('(.)*(%s)' %myPattern, 'Hello, how are you ?')*
.
匹配正则表达式中的任何内容。基本上,您要求匹配跳过匹配您的模式所需的任意数量的字符。