关于正则表达式中的 \Z



为什么这会返回我 [ABC]

s='''ABC'''
# use findall to return the parts we want
print(re.findall(r'ABCZ', s))

虽然这什么也没给我?

s='''ABC'''
# use findall to return the parts we want
print(re.findall(r'ABC[Z]', s))

根本原因

当锚点或单词边界被放置在字符类中时,它们就失去了特殊含义。 根据re文档:


       []用于指示一组字符。


       b......在字符范围内,b表示退格字符,以便与 Python 的字符串文本兼容。

Z的行为方式与b相同:在字符类中,锚点含义丢失。请注意,r'Z'在 3.6 之前的 Python 版本中不会产生任何警告,并且匹配单个Z,因为它是 Python re的未知转义:

j这样的未知逃生被单独留下。

从 Python 3.6 开始,您不能使用后面带有 ASCII 字母的,这是一个未知的转义(请参阅参考):

在 3.6 版更改: 由''和 ASCII 字母组成的未知转义现在是错误。

因此,Python 中高达 3.5 的r'[Z]'将按如下方式工作:

import re
print(re.findall(r'[Z]', '\Z')) # => ['Z']

溶液

要匹配(字符串)字母零宽度断言,请使用分组结构、捕获(...)或非捕获(?:...),并带有交替运算符|

(?:n|Z)

这将匹配换行符或字符串的末尾(在 Python 中,Z匹配字符串中与 PCRE/Perl/.NET 中的z相同的位置)。

s='''ABC'''
# use findall to return the parts we want
print(re.findall(r'ABC[Z]', s))
error: bad escape Z at position 4

此代码将返回错误。

关于字符类有一些规则:

特殊
  • 字符在集合中失去其特殊含义。例如,[(+*)]将匹配任何文字字符'(', '+', '*', or ')'

字符类中发生的事情是:正则表达式引擎试图转义字母Z。由于Z不是正则表达式中的特殊字符,因此引擎将返回错误。

相关内容

  • 没有找到相关文章

最新更新