理想的任务是让v
替换为u
变音符号。
我可以这样做:
>>> replacements = {'v':'u', u'v̄':u'ǖ', u'v́':u'ǘ', u'v̌':u'ǚ', u'v̀':u'ǜ'}
>>> s = u'lv́'
>>> for v, u in replacements.items():
... s = s.replace(v, u)
...
>>> s
'lǘ'
但是当我用str.maketrans
尝试它时,它会抛出一个ValueError:
>>> str.maketrans({'v':'u', u'v̄':u'ǖ', u'v́':u'ǘ', u'v̌':u'ǚ', u'v̀':u'ǜ'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: string keys in translate table must be of length 1
是否可以将str.maketrans
和str.tranlsate
用于unicode?
如果没有,那么适当的单一正则表达式替换是什么才能实现所需的输出?或者它也不可能吗?
答案 0 :(得分:1)
我希望这会有所帮助,但我不确定它比原始代码更有效。 (我假设你是在获得性能提升后?)
import re
replacements = {'v': 'u', 'v̀': 'ǜ', 'v̌': 'ǚ', 'v́': 'ǘ', 'v̄': 'ǖ'}
def replace(match):
return replacements[match.group(0)]
# alternative 1
assert re.sub(r'v̄|v́|v̌|v̀|v', replace, 'lv́vv̌') == 'lǘuǚ'
# alternative 2
assert re.sub(r'v[́̄̌̀]?', replace, 'lv́vv̌') == 'lǘuǚ'
请注意,在第一种选择中,将v
最后放在正则表达式中非常重要。否则它将首先匹配(而不是更长的序列)。