字典和字符串

时间:2014-04-23 07:59:17

标签: python regex dictionary ebnf mutated

这是我的代码无效:

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'

1 个答案:

答案 0 :(得分:1)

如果您需要动态替换,那么re.sub的功能形式就是这样。此外,我认为最好将整个事物包装在循环中以处理任意深度的替换(在我的示例中,range取决于intdigit依赖于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'}

结果

{{1}}