假设我有一个正则表达式“
(\d+)(\w+)
”。有没有办法动态更新此正则表达式以在事实之后命名组?
我正在尝试以编程方式读取具有未命名捕获组的正则表达式,其格式字符串如
number::$1 letter::$2
。我想更新正则表达式以从格式字符串 (?P<number>\d+)(?P<letter>\w+)
中命名组。
请注意,我正在尝试更新正则表达式本身,而不是更新将表达式与某个字符串匹配的输出。
我真的想不出有什么办法可以让它发挥作用。
您可以找到那些不在字符类内、不在注释
(
内、未转义且后面不跟 (?# ... )
的 ?
,并将其替换为命名组语法。
实际匹配字符类、注释、
(?
序列、转义对……以及其他单独的字符可能更容易,并且在这些匹配中找到简单的(
匹配,并替换它们.
这是您可以使用的代码:
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)