到目前为止,这是我的代码:
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日,天气晴朗。 我想自动而不是手动执行此操作。我确信解决方案很简单,但到目前为止我找不到任何帮助。
答案 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
是带有替换的新字符串。如果您需要保留模板,只需创建该字符串的副本并在该副本中进行替换。在此版本中,如果无法解析占位符,则它将保留在字符串中。 (请注意,我在循环中交换了key
和placeholder
的含义,因为恕我直言,这样做更有意义。)
答案 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
对您来说,这可能是一个更容易的选择吗?