我找不到一种方法来使用字符串Template.(safe_)替换重音字符。
下面是一个例子:
from string import Template
d = {'vérité': 'truth'}
msg = 'je veux la ${vérité}'
msg = Template(msg).safe_substitute(**d)
print(msg)
这将输出je veux la ${vérité}
当我用verite
替换两个vérité
时,代码可以正常工作,所以我可以删除所有的重音符号(例如utf-8中的unidecode),但我宁愿不删除文本中的所有重音符号(为了清晰起见,也为了避免冲突)。我到处阅读,还是找不到答案。救命啊!先谢谢你了
3条答案
按热度按时间2eafrhcq1#
默认情况下,不支持对
string.Template
替换占位符使用任意Unicode字符串。根据文件:$identifier
命名与"identifier"
的Map键匹配的替换占位符默认情况下,"identifier"
仅限于以下划线或ASCII字母开头的任何不区分大小写的ASCII字母数字字符串(包括下划线)。强调我的。
为了减轻这个限制,你可以创建自己的
string.Template
子类,它覆盖了class属性idpattern
,该属性指定了用于检测有效占位符标识符的正则表达式:jgwigjjp2#
非常感谢你的回答。编译这些与其他一些阅读,我出来了这个解决方案,工程伟大!非常感谢
cbeh67ev3#
你面临的问题与Python的string.Template处理变量替换的方式有关。string.Template类使用一种语法,其中占位符包含在${}中。在您的示例中,变量名vérité导致了问题,因为它包含一个重音字符。
克服这个问题的一种方法是避免在模板中的变量名中使用特殊字符,包括重音字符。相反,您可以使用更简单的变量名,并将它们Map到字典中相应的重音值。
下面是演示这种方法的代码的更新版本:`from string import Template
在这个例子中,我用一个更简单的字符e替换了模板变量名中的重音字符é。然后,在字典d中,我将变量veriteMap到值'vérité'。这样,您就可以成功地执行变量替换,而无需从文本中删除重音。
注意:如果模板中有同一变量的多次出现,请确保字典中所有出现的变量名称都是相同的。