Python:"正则表达式意外结束"在re.compile期间,空括号

时间:2016-08-19 08:37:34

标签: python regex python-2.7

总结一下,我有re.compile这样的声明:

markers = ['x'] # some list
re.compile(r" *[{}].*(?=\n|$)".format('\\'.join([''] + markers)))

对于大多数情况,它可以正常工作,除非markers为空,并且RegEx模式如下:

pattern = ' *[].*(?=\\n|$)'

为什么空字符集有问题?使其适用于空markers列表的解决方法是什么?

致谢:Martijn PietersWiktor StribiżewAmadan

总结:

    Regi中不存在
  • 空字符集[]被解析为[a,因此解释器期望关闭]并导致错误,
  • 必须在编译此模式之前检查空markers,以避免无效的空括号[]
  • .*(?=\n|$)有多余的(?=\n|$),可以简化为.*
  • 在括号[]内有效地转义特殊字符,使用re.escape()会更好。

为我的问题添加解决方案是:

if markers:
    re.compile(r" *[{}].*".format(re.escape(''.join(markers))))
else:
    # something

1 个答案:

答案 0 :(得分:1)

您可以检查标记列表一开始是否为空 ,然后,只转义必须在字符类中转义的字符:^,{{1} },\][

请注意,如果标记列表为空,则模式变为-,基本上接受任何行。您可以将其与 *.*匹配。

这是我的建议:

"^.*$"

请参阅Python demo

此外,import re markers = ['x', ']', '[', '-', '^', '\\'] # some list global p #markers = [] # some list if markers: escaped = [re.sub(r"[][^\\-]", r"\\\g<0>", x) for x in markers] pat = r" *[{}].*".format("".join(escaped)) p = re.compile(pat) else: p = re.compile("^.*$") print(p.pattern) 实际上可以缩减为.*(?=\n|$),因为.*匹配任何字符,但换行符(它也可以匹配CR符号),.将始终将所有字符匹配到.*或字符串结尾。