这是我的代码无效:
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'
答案 0 :(得分:1)
如果您需要动态替换,那么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'}
结果
{{1}}