我正在尝试以正则表达式模式查找转义命令。
我遇到的问题是,在一次转义反斜杠之前我无法处理转义的反斜杠。以下代码在要编译的模式中查找正则表达式组\g<...>
,但未找到名为not_escaped
的组:原始字符串\\\\\g
被视为转义序列从正则表达式的角度来看,反斜杠后跟未转义的组\g
。
import re
p = re.compile(r"(?<!\\)\\g<([a-zA-Z_][a-zA-Z\d_]*)>")
for m in p.finditer(
r"</\g<name_1>\g<name_2>\\\\\g<not_escaped>\\g<escaped>>>"
):
print(m.group(1))
此代码提供名称name_1
和name_2
,但如果文本由re
编译,则通常使用的组,如果我没有错,将成为组{ {1}},name_1
和name_2
。
答案 0 :(得分:1)
要匹配奇数个反斜杠,只需使用此模式:
r'(?<!\)(\\\\)*\\g...'
但我认为在你的情况下你必须搜索可以分为四个(然后再增加一个反斜杠)的反斜杠计数,所以你应该使用它:
p = re.compile(r"(?<!\\)(\\\\\\\\)*\\g<([a-zA-Z_][a-zA-Z\d_]*)>")
for m in p.finditer(
r"</\g<name_1>\g<name_2>\\\\\g<not_escaped>\\\g<escaped>>>"):
print(m.group(2))
找到你想要的三个而不是你想要的第四个。