使用带重音键的python字符串替换

1rhkuytd  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(103)

我找不到一种方法来使用字符串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),但我宁愿不删除文本中的所有重音符号(为了清晰起见,也为了避免冲突)。我到处阅读,还是找不到答案。救命啊!先谢谢你了

2eafrhcq

2eafrhcq1#

默认情况下,不支持对string.Template替换占位符使用任意Unicode字符串。根据文件:
$identifier命名与"identifier"的Map键匹配的替换占位符默认情况下,"identifier"仅限于以下划线或ASCII字母开头的任何不区分大小写的ASCII字母数字字符串(包括下划线)。
强调我的。
为了减轻这个限制,你可以创建自己的string.Template子类,它覆盖了class属性idpattern,该属性指定了用于检测有效占位符标识符的正则表达式:

class MyTemplate(Template):
    # Regular expression describing the pattern for placeholders.
    # Default: (?a:[_a-z][_a-z0-9]*)
    idpattern = "\w+"

d = {'vérité': 'truth'}
msg = 'je veux la ${vérité}'
msg = MyTemplate(msg).safe_substitute(**d)
print(msg)
# outputs "je veux la truth"
jgwigjjp

jgwigjjp2#

非常感谢你的回答。编译这些与其他一些阅读,我出来了这个解决方案,工程伟大!非常感谢

from string import Template
class MyTemplate(Template):
    idpattern = r'([A-zÀ-ú]+)'
d = {'vérité': 'truth'}
msg = 'je veux la ${vérité}'
msg = MyTemplate(msg).safe_substitute(**d)
print(msg)
cbeh67ev

cbeh67ev3#

你面临的问题与Python的string.Template处理变量替换的方式有关。string.Template类使用一种语法,其中占位符包含在${}中。在您的示例中,变量名vérité导致了问题,因为它包含一个重音字符。
克服这个问题的一种方法是避免在模板中的变量名中使用特殊字符,包括重音字符。相反,您可以使用更简单的变量名,并将它们Map到字典中相应的重音值。
下面是演示这种方法的代码的更新版本:`from string import Template

from string import Template

d = {'verite': 'vérité'}
msg = 'je veux la $verite'
msg = Template(msg).safe_substitute(**d)
print(msg)

在这个例子中,我用一个更简单的字符e替换了模板变量名中的重音字符é。然后,在字典d中,我将变量veriteMap到值'vérité'。这样,您就可以成功地执行变量替换,而无需从文本中删除重音。
注意:如果模板中有同一变量的多次出现,请确保字典中所有出现的变量名称都是相同的。

相关问题