str3.maketrans或re.sub for Python3中的unicode

时间:2017-06-07 05:40:39

标签: regex string python-3.x unicode translate

理想的任务是让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?

如果没有,那么适当的单一正则表达式替换是什么才能实现所需的输出?或者它也不可能吗?

1 个答案:

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