非法正则表达式组的正则表达式模式`\ g< ...>`

时间:2013-12-29 23:25:34

标签: python regex regex-group

在以下正则表达式r"\g<NAME>\w+"中,我想知道名为NAME的组必须用于与匹配相对应的替换。

哪个正则表达式匹配错误使用\g<...>

例如,以下代码查找任何未转义的组。

p = re.compile(r"(?:[^\\])\\g<(\w+)>")

for m in p.finditer(r"\g<NAME>\w+\\g<ESCAPED>"):
    print(m.group(1))

但还有最后一个问题需要解决。如何管理\g<WRONGUSE\>\g\<WRONGUSE>的案例?

4 个答案:

答案 0 :(得分:0)

据我所知,对命名捕获组的唯一限制是你不能在其中放置元字符,例如. \等......

您是否遇到过命名捕获组的某些问题?

你使用的正则表达式,r"illegal|(\g<NAME>\w+)"只是非法的,因为你引用了一个反向引用,而没有在正则表达式字符串中声明它。如果要创建命名捕获组,则为(?P<NAME>regex)

像这样:

>>> import re
>>> string = "sup bro"
>>> re.sub(r"(?P<greeting>sup) bro", r"\g<greeting> mate", string)
'sup mate'

如果您想对正在使用的实际正则表达式字符串进行某种分析,我认为re模块中没有任何内容可以本地执行此操作。

您需要在字符串本身上运行另一个匹配,因此,您可以将正则表达式放入字符串变量中,然后匹配\(\?P<(.*?)>\)之类的内容,这将为您提供指定的捕获组名称。

我希望这就是你要求的......让我知道。

答案 1 :(得分:0)

那么,你想要的是获取组名的字符串,对吗?

也许你可以通过这样做得到它:

>>> regex = re.compile(r"illegal|(?P<group_name>\w+)")
>>> regex.groupindex
{'group_name': 1}

如您所见,groupindex返回一个字典,用于映射组名称及其在正则表达式中的位置。有了这个,很容易检索字符串:

>>> # A list of the group names in your regex:
... regex.groupindex.keys()
['group_name']

>>> # The string of your group name:
... regex.groupindex.keys()[0]
'group_name'

不知道那是不是你要找的......

答案 2 :(得分:0)

使用否定前瞻?

\\g(?!<\w+>)

此搜索任何g 而非后跟<…>,因此“使用错误”。

答案 3 :(得分:0)

感谢所有评论,我有这个解决方案。

# Good uses.
p = re.compile(r"(?:[^\\])\\g<(\w+)>")

for m in p.finditer(r"</\g\<at__tribut1>\\g<notattribut>>"):
    print(m.group(1))

# Bad uses.
p = re.compile(r"(?:[^\\])\\g(?!<\w+>)")

if p.search(r"</\g\<at__tribut1>\\g<notattribut>>"):
    print("Wrong use !")
相关问题