以模式查找转义的组

时间:2014-01-08 08:58:03

标签: python regex

我正在尝试以正则表达式模式查找转义命令。

我遇到的问题是,在一次转义反斜杠之前我无法处理转义的反斜杠。以下代码在要编译的模式中查找正则表达式组\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_1name_2,但如果文本由re编译,则通常使用的组,如果我没有错,将成为组{ {1}},name_1name_2

1 个答案:

答案 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))

找到你想要的三个而不是你想要的第四个。