Regex 关于正则表达式中的\Z

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)) 此代码将返回一个错误 关于字符类,有一些规则: 特殊角色在场景中失去了特殊意义。例如,[(++*

为什么这会让我返回[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))
此代码将返回一个错误

关于字符类,有一些规则:

  • 特殊角色在场景中失去了特殊意义。例如,
    [(++*)]
    将匹配任何文本字符
    '('、'+'、'*'或')
character类中发生的情况是:正则表达式引擎试图转义字母
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)