用Python正则表达式匹配字符串中间的管字符

用Python正则表达式匹配字符串中间的管字符,python,regex,Python,Regex,我试图使用Python正则表达式匹配字符串中的管道字符,但似乎无法使其匹配。我把它归结为一个简化的版本 假设我正在字符串中查找序列z | a。以下是一些可能的正则表达式和结果: >>> import re >>> re.match(r'|', 'xyz|abc') <_sre.SRE_Match object at 0x2d9a850> >>> re.match(r'z|', 'xyz|abc') <_sre.SRE_Mat

我试图使用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')
>>> 
>>重新导入
>>>关于匹配(r'|','xyz | abc')
>>>关于匹配(r'z |','xyz | abc')
>>>关于匹配(r'| a',xyz | abc')
>>>关于匹配(r'z | a',xyz | abc')
>>>关于匹配(r'z\|a',xyz | abc')
>>>关于匹配(r'z\\\|a',xyz | abc')
>>>关于匹配(r'z\\\\\\\\\\\\\\\\\'a',xyz\\\\'abc')
>>>关于匹配(r'z[|]a',xyz | abc')
>>> 
所以我可以匹配
|
|a
z
,但我找不到匹配
z | a
的方法。有什么想法吗?

re.match()
正在字符串开头寻找匹配项。改用
re.search()

匹配的模式与空字符串匹配。i、 e.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>
重新匹配('z\\|a','xyz | abc') >>>再搜索('z\\\|a','xyz | abc') >>>检索(r'z\|a',xyz | abc')

更一般地,你可以在一个字串中使用Re.Enter()/<代码>,你需要在一个更复杂的正则表达式的中间包含它,以避免找出需要多少反斜杠才能逃脱。

< P>你可以使用下面的方法得到<代码> Re.Matals<代码>匹配字符串的中间。

myPattern = "how"

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

匹配正则表达式中的任何内容。基本上,您要求match跳过匹配模式所需的任意数量的字符。

使用双引号而不是单引号是行不通的?啊,谢谢-我应该意识到匹配/搜索问题。还有
re.escape()
的额外积分(如果我能给他们的话),谢谢@Duncan的回答。为什么
'z\\'a'
'z\'a'
表达式返回相同的结果?在表达式解析之后,
'z\\\'a'
->
'z\'a'
'z\'a'
->
'z\'a'
,因此它们不应该产生相同的
搜索()
结果。请纠正我哪里出了问题。@CᴴᴀZ
'Z\\| a'
'Z\|a'
都是完全相同的字符串。字符串中的
\\\\124;
不是有效的Python转义序列,因此Python只将其视为两个字符。谢谢@Duncan,我找到了它。我将这些步骤分解为:
stringparse
(查找escape seq)->
regex parse
<在字符串解析之后,code>z\\| a计算为
z\| a
,而
z\| a
计算为
z\| a
,如您所述(
\\\\
不是有效的转义序列)。由于
string parse
之后的结果在这两种情况下是相同的,因此结果也是相同的。