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