【问题标题】:How can I convert a unicode string into string literals in Python 2.7?如何在 Python 2.7 中将 unicode 字符串转换为字符串文字?
【发布时间】:2014-01-13 12:34:09
【问题描述】:

Python2.7: 我想做一些不寻常的事情。大多数人都希望将字符串文字转换为更易读的字符串。我想将以下 unicode 字符串列表转换为其文字形式:

  • hallöchen
  • 大街
  • Gemüse
  • freø̯̯nt

到他们看起来像这样的代码点形式:

\u3023\u2344

您会注意到 freø̯̯nt 在 ø 下方有两个倒置短号。我特别想把这个词转换成它的字面形式,这样我就可以使用 REGEX 来删除多余的短句。

我不确定这些东西的术语是什么——如果我弄错了,请纠正我。

【问题讨论】:

    标签: python regex string python-2.7 unicode


    【解决方案1】:

    您可以将str.encode([encoding[, errors]]) 函数与unicode_escape 编码一起使用:

    >>> s = u'freø̯̯nt'
    >>> print(s.encode('unicode_escape'))
    b'fre\\xf8\\u032f\\u032fnt'
    

    【讨论】:

    • 谢谢,但我收到此错误:SyntaxError: Non-ASCII character '\xc3' in file ~/Python/unicode to raw literals.py on line 1, but no encoding declared;
    • @macmadness86:嗯,您的编辑器使用的是哪种编码?在 Python 2 中,ASCII 是默认的源代码编码 - 如果您使用其他编码,则需要在脚本顶部显式声明它。
    • @TimPietzcker 就是这样!我刚刚在文件顶部添加了# -*- coding: utf-8 -*-,它起作用了。谢谢!我认为这是可行的,因为我的脚本中有 unicode 字符:freø̯̯nt
    【解决方案2】:

    您会注意到 freø̯̯nt 在 ø 下方有两个倒置短号。我特别想把那个词转换成它的文字形式,这样我就可以使用 REGEX 来删除多余的短句。

    在这种情况下,您不需要 codecs.encode(unicode_string, 'unicode-escape')。内存中没有字符串文字,只有字符串对象。

    Unicode 字符串是 Python 中的 Unicode 代码点序列。可以使用不同的代码点编写相同的用户感知字符,例如,'Ç' 可以编写为 u'\u00c7'u'\u0043\u0327'

    您可以使用NFKD Unicode normalization form 确保“breves”是分开的,以免在重复时错过它们:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import re
    import unicodedata
    
    s = u"freø̯̯nt"
    # remove consecutive duplicate "breves"
    print(re.sub(u'\u032f+', u'\u032f', unicodedata.normalize('NFKD', s)))
    

    您能解释一下为什么您的 re.sub 命令没有任何 +1 来确保短字符是连续字符吗? (如@Paulo Freitas's answer

    re.sub('c+', 'c', text) 确保文本中没有“cc”、“ccc”、“cccc”等。有时,正则表达式会通过将'c' 替换为'c' 来做不必要的工作。但结果是一样的:文本中没有连续重复的'c'

    @Paulo Freitas's answer 的正则表达式也应该可以工作:

    no_duplicates = re.sub(u'(\u032f)\\1+', r'\1', unicodedata.normalize('NFKD', s))
    

    它仅对重复项执行替换。如果它是应用程序的瓶颈,您可以测量时间性能并查看哪个正则表达式运行得更快。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多