如何在Python 2.7中将unicode字符串转换为字符串文字?

Jon*_*mar 5 python regex string unicode python-2.7

Python2.7:我想做一些与众不同的事情.大多数人希望将字符串文字转换为更易读的字符串.我想将以下unicode字符串列表转换为它们的文字形式:

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

他们的代码点表单看起来像这样:

\ u3023\u2344

你会注意到freø̯̯nt在ø下面有两个倒置的短裤.我想特别将该单词转换为其字面形式,以便我可以使用REGEX来删除额外的短语.

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

jfs*_*jfs 2

\n

您会注意到 fre\xc3\xb8\xcc\xaf\xcc\xafnt 在 \xc3\xb8 下方有两个倒置的短音符。我特别想将该单词转换为其字面形式,以便我可以使用 REGEX 删除多余的短音符。

\n
\n\n

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

\n\n

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

\n\n

您可以使用NFKDUnicode 规范化形式来确保“breves”是独立的,以便在重复时不会错过它们:

\n\n
#!/usr/bin/env python\n# -*- coding: utf-8 -*-\nimport re\nimport unicodedata\n\ns = u"fre\xc3\xb8\xcc\xaf\xcc\xafnt"\n# remove consecutive duplicate "breves"\nprint(re.sub(u\'\\u032f+\', u\'\\u032f\', unicodedata.normalize(\'NFKD\', s)))\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n
\n

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

\n
\n\n

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

\n\n

@Paulo Freitas 的答案中的正则表达式也应该有效:

\n\n
no_duplicates = re.sub(u\'(\\u032f)\\\\1+\', r\'\\1\', unicodedata.normalize(\'NFKD\', s))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n