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.maketrans
和 str.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
放在正则表达式的最后很重要。否则它将首先匹配(而不是较长的序列)。
期望的任务是将 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?
如果不是,什么是合适的单个正则表达式替换来实现所需的输出?还是也不可能?
希望这对您有所帮助,但我不确定它是否比您的原始代码更有效。 (我假设您是在追求性能提升?)
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
放在正则表达式的最后很重要。否则它将首先匹配(而不是较长的序列)。