用python中的字典字段替换占位符标记

时间:2015-06-04 14:31:18

标签: python regex

到目前为止,这是我的代码:

import re
template="Hello,my name is [name],today is [date] and the weather is [weather]"
placeholder=re.compile('(\[([a-z]+)\])')
find_tags=placeholder.findall(cam.template_id.text)
fields={field_name:'Michael',field_date:'21/06/2015',field_weather:'sunny'}

for key,placeholder in find_tags:
assemble_msg=template.replace(placeholder,?????)
print assemble_msg

我想用关联的字典字段替换每个标记,最后的消息是这样的: 我的名字是迈克尔,今天是2015年6月21日,天气晴朗。 我想自动而不是手动执行此操作。我确信解决方案很简单,但到目前为止我找不到任何帮助。

2 个答案:

答案 0 :(得分:6)

无需使用正则表达式的手动解决方案。这是str.format已经支持的(格式略有不同):

>>> template = "Hello, my name is {name}, today is {date} and the weather is {weather}"
>>> fields = {'name': 'Michael', 'date': '21/06/2015', 'weather': 'sunny'}
>>> template.format(**fields)
Hello, my name is Michael, today is 21/06/2015 and the weather is sunny

如果您无法相应地更改template字符串,则可以在预处理步骤中轻松地将[]替换为{}。但请注意,如果其中一个占位符不在KeyError字典中,则会引发fields

如果您想保留手动方法,可以尝试这样:

template = "Hello, my name is [name], today is [date] and the weather is [weather]"
fields = {'field_name': 'Michael', 'field_date': '21/06/2015', 'field_weather': 'sunny'}
for placeholder, key in re.findall('(\[([a-z]+)\])', template):
    template = template.replace(placeholder, fields.get('field_' + key, placeholder))

或者更简单一点,不使用正则表达式:

for key in fields:
    placeholder = "[%s]" % key[6:]
    template = template.replace(placeholder, fields[key])

之后,template是带有替换的新字符串。如果您需要保留模板,只需创建该字符串的副本并在该副本中进行替换。在此版本中,如果无法解析占位符,则它将保留在字符串中。 (请注意,我在循环中交换了keyplaceholder的含义,因为恕我直言,这样做更有意义。)

答案 1 :(得分:1)

您可以使用词典将数据直接放入字符串中,例如......

fields={'field_name':'Michael','field_date':'21/06/2015','field_weather':'sunny'}
string="Hello,my name is %(field_name)s,today is %(field_date)s and the weather is %(field_weather)s" % fields

对您来说,这可能是一个更容易的选择吗?