字典和字符串
Posted
技术标签:
【中文标题】字典和字符串【英文标题】:dictionaries and strings 【发布时间】:2014-06-07 22:20:26 【问题描述】:这是我的代码不起作用:
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'
【问题讨论】:
什么不起作用?你有错误吗? @user3527631 您希望它如何工作?'\\1'
不是密钥,所以你会得到一个 KeyError
。
你只是在编译模式,没有匹配任何东西。可能您必须调用re.find
,然后将其结果用作键或类似键。
问题是您正在使用该键在执行子操作之前访问字典。该键不被解释为正则表达式的一部分,而只是一个不存在的键。
【参考方案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'
【讨论】:
以上是关于字典和字符串的主要内容,如果未能解决你的问题,请参考以下文章