【问题标题】:str.maketrans or re.sub for unicode in Python3Python3 中用于 unicode 的 str.maketrans 或 re.sub
【发布时间】:2017-11-08 07:37:29
【问题描述】:

所需的任务是将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?

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

【问题讨论】:

  • 我认为maketrans 不会在这里工作。我认为单个正则表达式也不会真正起作用。 (您可以创建一个为每个替换调用一个函数,但这似乎是一个奇怪的解决方案。)您的原始代码有什么问题?
  • 无论原始字符串中是否出现任何形式的“v”,原始代码都会进行5次操作。我认为 str.maketransstr.translate 是可能的,因为它可以正常工作于非 unicode 字符串。
  • 我相信str.maketrans 可以很好地与 unicode 配合使用,但它仅在映射的“from”端包含长度为 1 的字符串时才有效。

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


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

【讨论】:

  • 酷!我没有意识到re.sub 的这种用法 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多