在以下正则表达式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>
的案例?
答案 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 !")