对于其他语言,这个问题似乎已经被问过几次了。我有一个类似sql的脚本,其中包含占位符,例如“ @@ Variable1 @@”,“ @@ Variable2 @@”等。我在python中也有一个字典,其中包含这些参数的值。我需要用字典中键的特定值替换文本文件中(在此字典中)键的出现。虽然我可以遍历字典并使用一些文本替换命令来执行此操作,但是还有一种更有条理的方式(例如lib)来执行此操作。
答案 0 :(得分:1)
我不知道图书馆,但是这是您自己进行替换的方法。
您实际上并不想遍历字典中的键,因为您将不得不多次扫描文本-而是可以分别使用re.sub
并在字典中查找(快速)找到一对@@
之间包含的字符串的时间。这样,您只浏览一次文本。
如果找不到匹配项,您可能需要决定要怎么做,但这是一个示例。
import re
def from_dict(dct):
def lookup(match):
key = match.group(1)
return dct.get(key, f'<{key} not found>')
return lookup
subs = {"name": "John",
"age": "40"}
text = "Name: @@name@@ Age: @@age@@ Occupation: @@occupation@@"
print(re.sub('@@(.*?)@@', from_dict(subs), text))
这给出了:
Name: John Age: 40 Occupation: <occupation not found>
与get
稍等长但可能更有效的等效方法是显式测试:
return dct[key] if key in dct else f'<{key} not found>'
如果实际上找到了密钥,它将保存格式化字符串的格式。
答案 1 :(得分:1)
使用re.sub
对于此任务将是最优雅,最有效的方法。
这一行足以完成这项工作:
re.sub(r"@@(\w+)@@", lambda match: parameter_values_dict[match.group(1)], input_text)
这是完整的解决方案:
>>> import re
>>> parameter_values_dict = {"variable1":"VAR1", "variable2":"VAR2"}
>>> input_text = "some text @@variable1@@ some more text @@variable2@@ some extra text"
>>> output_text = re.sub(r"@@(\w+?)@@", lambda match: parameter_values_dict[match.group(1)], input_text)
>>> print(output_text)
some text VAR1 some more text VAR2 some extra text