我有一个详细的(re.X
)标记正则表达式抛出异常,即使它似乎等同于它的精简版本。 (我从后者建立了前者。)
简明版:
import re
test = 'catdog'
test2 = 'dogcat'
pat = re.compile(r'(?=\b\w{6}\b)\b\w*cat\w*\b')
print(pat.search(test))
print(pat.search(test2))
# catdog Match object
# dogcat Match object
详细版本:
pat = re.compile(r"""( # Start of group (lookahead); need raw string
?= # Positive lookahead; notation = `q(?=u)`
\b\w{6}\b # Word boundary and 6 alphanumeric characters
) # End of group (lookahead)
\b\w*cat\w*\b # Literal 'cat' in between 0 or more alphanumeric""", re.X)
print(pat.search(test).string)
print(pat.search(test2).string)
# Throws exception
# error: nothing to repeat at position 83 (line 2, column 22)
造成这种情况的原因是什么?我无法找到扩展版本违反re.X
/ re.VERBOSE
条件的原因。来自docs:
此标志允许您编写看起来更好的正则表达式 通过允许您在视觉上分离逻辑来更具可读性 模式的各个部分并添加注释。内部的空白 除非在字符类中或在前面时,否则忽略pattern 通过未经证实的反斜杠。当一行包含一个不在的#时 所有都是字符类,并且前面没有未转义的反斜杠 从最左边这样#到行尾的字符是 忽略。
据我所知,没有字符类或空格前面有未转义的反斜杠。
答案 0 :(得分:3)
这是Python issue 15606。 re
在详细模式下使用空格内的空格的行为与文档不匹配。你不能在(?=
的中间放置空格。
答案 1 :(得分:2)
问题在于第二行的?=
。
?
可以表示[ ]?
之类的多个事物,它们是0或1个空格,我相信它前面的空格就是这种情况。空格 被忽略,但它将两个字符(
和?
分隔为实体。
将?=
移至第1行,它将起作用。与(?=
错误
error: nothing to repeat at position 83
非常清楚?
在这里被解释为重复