str.maketrans 或 re.sub 对于 Python3 中的 unicode

str.maketrans or re.sub for unicode in Python3

期望的任务是将 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.maketransstr.tranlsate 作为 unicode?

如果不是,什么是合适的单个正则表达式替换来实现所需的输出?还是也不可能?

希望这对您有所帮助,但我不确定它是否比您的原始代码更有效。 (我假设您是在追求性能提升?)

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 放在正则表达式的最后很重要。否则它将首先匹配(而不是较长的序列)。