替换重复捕获

2024-04-29 04:00:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这是Python regex - Replace single quotes and brackets线程的后续操作。在

任务:

输入字符串示例:

RSQ(name['BAKD DK'], name['A DKJ'])
SMT(name['BAKD DK'], name['A DKJ'], name['S QRT'])

期望输出:

^{pr2}$

name['something']项的数目是变量。在

当前解决方案:

目前,我正在通过两个独立的re.sub()调用来实现这一点:

>>> import re
>>>
>>> s = "RSQ(name['BAKD DK'], name['A DKJ'])"
>>> s1 = re.sub(r"^(\w+)", "XYZ", s)
>>> re.sub(r"name\['(.*?)'\]", r"\1", s1)
'XYZ(BAKD DK, A DKJ)'

问题:

是否可以将这两个re.sub()调用合并为一个调用?在

换句话说,我想替换字符串开头的内容,然后替换后面的多个类似的内容,所有这些都一次性完成。在


我已经研究过^{} module-它的capture repeated patterns功能看起来很有前途,尝试使用regex.subf()但没能成功。在


Tags: and字符串namere内容replaceregexquotes
3条回答

您确实可以使用regex模块和重复捕获。主要的兴趣是您可以检查匹配字符串的结构:

import regex

regO = regex.compile(r'''
    \w+ \( (?: name\['([^']*)'] (?: ,[ ] | (?=\)) ) )* \)
    ''', regex.VERBOSE);

regO.sub(lambda m: 'XYZ(' + (', '.join(m.captures(1))) + ')', s)

(请注意,您可以将"name"替换为\w+或任何您想要的东西,而不会出现问题。)

你可以这么做。虽然我觉得它不太可读。如果你开始添加更多的模式来替换,这样做可能会变得不规则。它利用了替换字符串也可以是函数这一事实。在

s = "RSQ(name['BAKD DK'], name['A DKJ'])"
re.sub(r"^(\w+)|name\['(.*?)'\]", lambda m: 'XYZ' if m.group(1) else m.group(2), s)

请不要在我必须维护的任何代码中这样做。在

您正在尝试解析语法上有效的Python。使用^{}来完成。它更易读,更容易扩展到新的语法,并且不会在一些奇怪的情况下崩溃。在

工作样品:

from ast import parse

l = [
    "RSQ(name['BAKD DK'], name['A DKJ'])",
    "SMT(name['BAKD DK'], name['A DKJ'], name['S QRT'])"
]

for item in l:
    tree = parse(item)
    args = [arg.slice.value.s for arg in tree.body[0].value.args]

    output = "XYZ({})".format(", ".join(args))
    print(output)

印刷品:

^{pr2}$

相关问题 更多 >