Regex 关于正则表达式中的\Z
为什么这会让我返回[ABC]Regex 关于正则表达式中的\Z,regex,python-2.7,Regex,Python 2.7,为什么这会让我返回[ABC] s='''ABC''' # use findall to return the parts we want print(re.findall(r'ABC\Z', s)) 而这对我来说什么都没有 s='''ABC''' # use findall to return the parts we want print(re.findall(r'ABC[\Z]', s)) 此代码将返回一个错误 关于字符类,有一些规则: 特殊角色在场景中失去了特殊意义。例如,[(++*
s='''ABC'''
# use findall to return the parts we want
print(re.findall(r'ABC\Z', s))
而这对我来说什么都没有
s='''ABC'''
# use findall to return the parts we want
print(re.findall(r'ABC[\Z]', s))
此代码将返回一个错误
关于字符类,有一些规则:
- 特殊角色在场景中失去了特殊意义。例如,
将匹配任何文本字符[(++*)]
'('、'+'、'*'或')
Z
。由于Z
不是正则表达式中的特殊字符,引擎将返回错误。根本原因
当一个or被放入一个a中时,它们就失去了特殊的意义。根据:
[]
用于指示一组字符 及
\b
... 在字符范围内,
\b
表示退格字符,以便与Python的字符串文本兼容
\Z
的行为方式与\b
相同:在字符类中,锚的含义丢失。请注意,r'\Z'
在3.6之前的Python版本中不会产生任何警告,并且与单个Z
匹配,因为它是用于Python re:
诸如\j
之类的未知转义被忽略
从Python3.6开始,您不能使用带有ASCII字母的\
作为未知转义(请参阅):
在版本3.6中更改:由'\'
和ASCII字母组成的未知转义现在是错误
因此,在3.5版之前的Python中,r'[\Z]'
的工作原理如下:
import re
print(re.findall(r'[\Z]', '\\Z')) # => ['Z']
解决方案
要匹配(字符串)字母或零宽度断言,请使用带有|
的捕获(…)
或非捕获(?:…)
:
(?:\n|\Z)
这将匹配换行符或字符串的最末端(在Python中,
\Z
与PCRE/Perl/.NET中的\Z
匹配字符串中的相同位置)。\Z
匹配位置,而不是字符,因此它只是指字符类中的[Z]
。想想看,就像\b
@4castle实际上我面临着一个无法使用[\Z\n]的问题,你对此有什么意见吗?@4castle那里的解决方案会错过最后一行,因为它正在使用\Z@4castle,谢谢你的提问和其他问题,如果你能作为答案发帖,我可以接受:)
(?:\n|\Z)