【发布时间】:2023-03-20 08:12:01
【问题描述】:
总结一下我有re.compile这样的声明:
markers = ['x'] # some list
re.compile(r" *[{}].*(?=\n|$)".format('\\'.join([''] + markers)))
在大多数情况下,它可以正常工作除非markers 为空并且 RegEx 模式看起来像这样:
pattern = ' *[].*(?=\\n|$)'
为什么空字符集有问题?使其适用于空 markers 列表的解决方法是什么?
解决方案
学分:Martijn Pieters、Wiktor Stribiżew 和 Amadan。
总结一下:
-
空字符集 在 RegEx 中不存在。
[]的解析方式与[a类似,因此解释器期望关闭],这会导致错误, - 必须在编译此模式之前检查空的
markers,以避免无效的空括号[], -
.*(?=\n|$)有多余的(?=\n|$),可以简化为.*, - 要在括号内有效地转义特殊字符
[],最好使用re.escape()。
为我的问题添加解决方案是:
if markers:
re.compile(r" *[{}].*".format(re.escape(''.join(markers))))
else:
# something
【问题讨论】:
-
没有空字符类,所以
[]无效。测试一个空的标记列表并编译一个更简单的表达式? -
另外,
(?=\n|$)是多余的。 -
好吧,当前代码抛出了一个异常,因为
\x不是一个有效的模式(它后面必须有 2 位数字)。你不能像那样逃避任何你想要的角色。 -
所以
markers为空,您基本上是在寻找一些空白。另一个注意事项:只需使用re.escape(),而不是使用\手动添加所有内容。 -
@MartijnPieters:不是无效的,只是不完整。
re.compile(r"[]]").sub("found", "]")。具体来说,在字符类中转义右括号有两种方法:通过添加反斜杠,或确保它是字符类中的第一个字符。所以当你写[]时,就像写[a一样——正则表达式仍然希望你关闭括号。
标签: python regex python-2.7