字典和字符串

2024-10-01 02:27:09 发布

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

这是我不工作的代码:

def myfunc(d):
    for name, pat in d.items():
        originalstring = pat
        pattern = '#\w+#'
        pattern_obj = re.compile(pattern)
        replacement_string = '('+d['\\1']+')'
        d[name] = pattern_obj.sub(replacement_string, originalstring)
    return d

我得到一个错误,上面写着:

KeyError: '\\1'

Tags: 代码nameinreobjforstringdef
1条回答
网友
1楼 · 发布于 2024-10-01 02:27:09

如果您需要动态替换,那么有一个函数形式re.sub。另外,我认为最好将整个过程包装成一个循环来处理任意深度的替换(在我的示例中,range依赖于int,而digit):

import re

def make_patterns(patdict):
    old, new = patdict, {}
    while True:
        for name, pat in old.items():
            new[name] = re.sub(r'#(\w+)#',
                lambda m: old[m.group(1)],
                pat)
        if new == old:
            return old
        old, new = new, {}


d = dict(
    digit=r'\d',
    integer=r'[=-]?#digit##digit#*',
    range='#integer#-#integer#'
)

print make_patterns(d)

结果

 {'integer': '[=-]?\\d\\d*', 'range': '[=-]?\\d\\d*-[=-]?\\d\\d*', 'digit': '\\d'}

相关问题 更多 >