Python 用表中的单个unicode替换字母数字子字符串

Python 用表中的单个unicode替换字母数字子字符串,python,regex,string,unicode,substitution,Python,Regex,String,Unicode,Substitution,根据输入: nguye64n tra62n huye62n my 期望输出: nguyễn trần huyền my 我一直在用一个替代表来做这件事,并迭代每个字符以查找数字,缓存它们,并在后面跟一个非数字字符时转换它们: substitute = {'e64': u'ễ', 'a62': u'ầ', 'e62': 'ề'} s = 'nguye64n tra62n huye62n my' tonal = '' x = '' for ch in s: if ch.isdigit()

根据输入:

nguye64n tra62n huye62n my
期望输出:

nguyễn trần huyền my
我一直在用一个替代表来做这件事,并迭代每个字符以查找数字,缓存它们,并在后面跟一个非数字字符时转换它们:

substitute = {'e64': u'ễ', 'a62': u'ầ', 'e62': 'ề'}
s = 'nguye64n tra62n huye62n my'
tonal = ''
x = ''
for ch in s:
    if ch.isdigit():
        tonal += ch
    else:
        if tonal:
            tonal = substitute[x[-1] + tonal]
            x = x[:-1] + tonal
            tonal = ''
        x += ch
[out]:

>>> x
'nguyễn trần huyền my'

在给定替换表的情况下,是否有更简单的方法来实现相同的输出?可能是正则表达式替换或一些
str.translate
操作?

函数
re.sub
可用于根据函数替换匹配项。在这里,我使用lambda函数处理匹配,并从查找表中替换它:

#coding:utf8
import re

substitute = {'e64': u'ễ', 'a62': u'ầ', 'e62': 'ề'}
s = 'nguye64n tra62n huye62n my'
x = re.sub(r'[a-z]\d+',lambda m: substitute[m.group(0)],s)
print(x)
恩圭ễn trần休伊ề我的


如果您使用
substitute.get(m.group[0],m.group[0])
而不是
substitute[m.group(0)]
当dict中没有匹配项时,您将不会得到
keyror
,它将返回原始文本。这可能是,也可能不是我们想要的行为