使用python替换文本文件中的占位符

时间:2020-08-20 09:32:18

标签: python text

对于其他语言,这个问题似乎已经被问过几次了。我有一个类似sql的脚本,其中包含占位符,例如“ @@ Variable1 @@”,“ @@ Variable2 @@”等。我在python中也有一个字典,其中包含这些参数的值。我需要用字典中键的特定值替换文本文件中(在此字典中)键的出现。虽然我可以遍历字典并使用一些文本替换命令来执行此操作,但是还有一种更有条理的方式(例如lib)来执行此操作。

2 个答案:

答案 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