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

时间:2017-03-06 02:58:43

标签: 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))

2 个答案:

答案 0 :(得分:1)

根本原因

anchorword boundary放入character class时,他们会失去特殊意义。加。到re documentation

  

[]
  用于表示一组字符。

  

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

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

  

\j之类的未知逃脱将一个人留下。

从Python 3.6开始,你不能使用带有ASCII字母的\作为未知的转义(参见reference):

  

在版本3.6中更改:包含'\'和ASCII字母的未知转义现在是错误。

因此,Python中的r'[\Z]'(最多3.5)将按如下方式工作:

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

解决方案

要匹配(字符串)字母零宽度断言,请使用grouping construct,捕获(...)或不捕获{{1 {}有alternation operator (?:...)

|

这将匹配换行符号,或者字符串的最后一行(在Python中,(?:\n|\Z) 匹配PCRE / Perl / .NET中与\Z相同的字符串位置。

答案 1 :(得分:0)

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不是正则表达式中的特殊字符,因此引擎将返回错误。