Python2.7: 我想做一些与众不同的事情。大多数人希望将字符串文字转换为更易读的字符串。我想将以下unicode字符串列表转换为它们的字面形式:
到他们的代码点表单看起来像这样:
\ u3023 \ u2344
你会注意到freø̯̯nt在ø下面有两个倒置的短裤。我想特别将该单词转换为其字面形式,这样我就可以使用REGEX删除额外的短语。
我不确定这些事情的术语是什么 - 如果我弄错了,请纠正我。
答案 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))
它仅对重复项执行替换。您可以测量时间性能,如果它是应用程序中的瓶颈,请查看正则表达式运行得更快。