总结一下,我有re.compile
这样的声明:
markers = ['x'] # some list
re.compile(r" *[{}].*(?=\n|$)".format('\\'.join([''] + markers)))
对于大多数情况,它可以正常工作,除非markers
为空,并且RegEx模式如下:
pattern = ' *[].*(?=\\n|$)'
为什么空字符集有问题?使其适用于空markers
列表的解决方法是什么?
致谢:Martijn Pieters,Wiktor Stribiżew和Amadan。
总结:
[]
被解析为[a
,因此解释器期望关闭]
并导致错误,markers
,以避免无效的空括号[]
,.*(?=\n|$)
有多余的(?=\n|$)
,可以简化为.*
,[]
内有效地转义特殊字符,使用re.escape()
会更好。为我的问题添加解决方案是:
if markers:
re.compile(r" *[{}].*".format(re.escape(''.join(markers))))
else:
# something
答案 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符号),.
将始终将所有字符匹配到.*
或字符串结尾。