re.VERBOSE和lookahead断言错误

时间:2017-11-10 16:53:35

标签: python regex python-3.x

我有一个详细的(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   通过未经证实的反斜杠。当一行包含一个不在的#时   所有都是字符类,并且前面没有未转义的反斜杠   从最左边这样#到行尾的字符是   忽略。

据我所知,没有字符类或空格前面有未转义的反斜杠。

2 个答案:

答案 0 :(得分:3)

这是Python issue 15606re在详细模式下使用空格内的空格的行为与文档不匹配。你不能在(?=的中间放置空格。

答案 1 :(得分:2)

问题在于第二行的?=?可以表示[ ]?之类的多个事物,它们是0或1个空格,我相信它前面的空格就是这种情况。空格 被忽略,但它将两个字符(?分隔为实体。

?=移至第1行,它将起作用。与(?=

一样

错误

error: nothing to repeat at position 83

非常清楚?在这里被解释为重复