替换"令牌"在Python字符串中具有替代值

时间:2014-09-04 14:37:02

标签: python python-2.7 interpolation

问题

想象一下接收字符串的脚本:

http://whatever.org/?title=@Title@&note=@Note@

...以及令牌列表:

['arg:Title=SampleTitle', 'arg:Note=SampleNote']

将这些标记插入到字符串中的最Pythonic方法是什么,这样,使用上面的示例,生成以下内容:

http://whatever.org/?title=SampleTitle&note=SampleNote

我的想法

  1. 循环遍历列表,并为其包含的每个字符串拆分令牌名称,并对找到的@TOKEN_NAME的每个实例执行正则表达式替换。

  2. 使用某种模板机制(类似于Ruby的ERB.template所能做到的)。

  3. 帮助吗

    我是Python的新手,非常喜欢专家的观点。谢谢!

1 个答案:

答案 0 :(得分:12)

要使用Pythonic解决方案,请采用str.formatformat string syntax规范:

>>> template = "http://whatever.org/?title={Title}&note={Note}"
>>> template.format(Title="SampleTitle", Note="SampleNote")
'http://whatever.org/?title=SampleTitle&note=SampleNote'

您还可以解压缩命名参数的字典:

>>> template.format(**{"Title": "SampleTitle", "Note": "SampleNote"})
'http://whatever.org/?title=SampleTitle&note=SampleNote'

如果您坚持输入格式,可以使用regular expression轻松切换到更实用的内容:

>>> import re
>>> s = "http://whatever.org/?title=@Title@&note=@Note@"
>>> re.sub(r"@(\w+?)@", r"{\1}", s)
'http://whatever.org/?title={Title}&note={Note}'

(请参阅正则表达式解释here

并将令牌处理成字典:

>>> tokens = ['arg:Title=SampleTitle', 'arg:Note=SampleNote']
>>> dict(s[4:].split("=") for s in tokens)
{'Note': 'SampleNote', 'Title': 'SampleTitle'}