我有一个详细的(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的任何条件。从医生那里:
此标志允许您编写看起来更好看、更易读的正则表达式,方法是允许您直观地分离模式的逻辑部分并添加注释。模式中的空白将被忽略,除非在字符类中或前面有一个未转义的反斜杠。当一行包含不在字符类中且前面没有未转义反斜杠的#时,从最左边的#到行尾的所有字符都会被忽略。
据我所知,在没有转义反斜杠的情况下,没有字符类或空白。
发布于 2017-11-10 17:07:11
我是Python第15606期。re在冗长模式下在令牌中使用空格的行为与文档不匹配,不能将空白放在(?=的中间。
发布于 2017-11-10 16:58:15
问题在于第二行的?=。?可以表示多个东西,比如[ ]?,它是0或1个空格,我认为它前面的空格是这样的。空格被忽略,但它正在将两个字符(和?变成分离的实体。
将?=移动到第一行,它就能工作了。就像(?=
误差
error: nothing to repeat at position 83清楚地表明,?在这里被解释为重复
https://stackoverflow.com/questions/47227654
复制相似问题