使用字典替换字符串

String substitution using dictionary

我正在学习 python 并研究字符串以找到使用字典进行字符串替换的更好方法

我有一个包含自定义占位符的字符串,如下所示:

placeholder_prefix = '$['
placeholder_suffix = ']'

dict={'key1':'string','key2':placeholders}
msg='This $[key1] contains custom $[key2]'

我希望占位符('prefix-suffix' 和 'keys')应替换为字典中的 'value',如下所示:

'此字符串包含自定义占位符'

我可以通过编写函数 'This [string] contains custom [placeholders]' 来获取消息:

def replace_all(text):
    for key, value in brand_dictionary.iteritems():
        text = text.replace(key, value).replace('$[', '[')        
    return text

我可以尝试不同的替换来删除“$[”和“]”,但这可以替换作为消息本身的一部分包含的任何字符(如“$”、“[”、“]”(而不是占位符的一部分)。所以我想避免这种情况,只替换自定义占位符。

我能想到正则表达式(用于占位符),但由于我的消息包含多个键,所以它似乎没有用?

python有更好的方法吗?

试试这个:

dict={key1:'string',key2:placeholders}

msg='This {key1} contains custom {key2}'.format(**dict)

示例一运行:

>>> msg="hello {a} {b}"
>>> t={"a":"aa","b":"bb"}
>>> msg="hello {a} {b}".format(**t)
>>> msg
'hello aa bb'

如果您可以更改占位符,则可以使用 - %(key)s - 和 % 运算符在这些位置自动应用字典。

示例 -

>>> dict={'key1':'string','key2':'placeholders'}
>>> msg='This %(key1)s contains custom %(key2)s'
>>> print(msg%dict)
This string contains custom placeholders

作为更通用的方法,您可以将 re.sub 与适当的替换功能一起使用:

>>> d={'key1':'string','key2':'placeholders'}
>>> re.sub(r'$\[([^\]]*)\]',lambda x:d.get(x.group(1)),msg)
'This string contains custom placeholders'

使用正则表达式的优点是它拒绝匹配不符合预期格式的字符串中的占位符!

或者作为更简单的方法,您可以使用如下字符串格式:

In [123]: d={'key1':'string','key2':'placeholders'}
     ...: msg='This {key1} contains custom {key2}'
     ...: 
     ...: 

In [124]: msg.format(**d)
Out[124]: 'This string contains custom placeholders'

或者,如果您的变量数量不是那么大,您可以将键作为当前命名空间中可访问的变量,而不是使用字典,然后使用自 [=23= 以来引入的功能 f-strings ]-3.6:

In [125]: key1='string'
     ...: key2= 'placeholders'
     ...: msg=f'This {key1} contains custom {key2}'
     ...: 

In [126]: msg
Out[126]: 'This string contains custom placeholders'

与其自己动手,不如考虑使用现有的模板库,例如 Mako (http://www.makotemplates.org/)。

他们已经做到了你想做的一切,还有很多你想不到的事情。

(是的,它们也可用于生成非 HTML 文本)

另一个选项包括使用字符串替换进行格式化:

msg='This %(key1)s contains custom %(key2)s'
dict={'key1':'string','key2':'placeholders'}
print(msg%dict)

>> This string contains custom placeholders