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

时间:2013-12-25 16:49:18

标签: python regex string python-2.7 unicode

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

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

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

\ u3023 \ u2344

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

我不确定这些事情的术语是什么 - 如果我弄错了,请纠正我。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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来确保breves是连续的字符吗? (如@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))

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