有没有办法在事后将Python正则表达式中的未命名捕获组更新为命名捕获组?

问题描述 投票:0回答:1

假设我有一个正则表达式“

(\d+)(\w+)
”。有没有办法动态更新此正则表达式以在事实之后命名组?

我正在尝试以编程方式读取具有未命名捕获组的正则表达式,其格式字符串如

number::$1 letter::$2
。我想更新正则表达式以从格式字符串
(?P<number>\d+)(?P<letter>\w+)
中命名组。

请注意,我正在尝试更新正则表达式本身,而不是更新将表达式与某个字符串匹配的输出。

我真的想不出有什么办法可以让它发挥作用。

python python-3.x regex
1个回答
0
投票

您可以找到那些不在字符类内、不在注释

(
内、未转义且后面不跟
(?# ... )
?
,并将其替换为命名组语法。

实际匹配字符类、注释、

(?
序列、转义对……以及其他单独的字符可能更容易,并且在这些匹配中找到简单的
(
匹配,并替换它们.

这是您可以使用的代码:

import re

def name_capture_groups(regex, names):
    revnames = names[::-1]

    def replacer(m):
        return f"(?<{revnames.pop()}>" if m[0] == "(" and revnames else m[0]

    charclass = r"\[\^?(?:\\.|[^\]])+\]"
    comment = r"\(\?#[^)]*\)"
    extension = r"\(\?(?!#)"
    escaped = r"\\."
    normal = r"[^([]"
    tokens = fr"(?:{extension}|{escaped}|{charclass}|{comment}|{normal})+|."
    return re.sub(tokens, replacer, regex, re.DOTALL)



# demo
regex = "(\d+)abcdef(?:hello)(\w+)(?#comment((()[^abc()]"
result = name_capture_groups(regex, ["digits", "name"])
print(result)
© www.soinside.com 2019 - 2024. All rights reserved.