2 回答
2
一个简单快速的解决方案是使用精确re.sub匹配\u四个十六进制数字,并将这些数字转换为 Unicode 代码点:
import re
s = r"blah bl\uah \u20ac € b\u20aclah\u12blah blah"
print(s)
s = re.sub(r'\\u([0-9a-fA-F]{4})',lambda m: chr(int(m.group(1),16)),s)
print(s)
输出:
blah bl\uah \u20ac € b\u20aclah\u12blah blah
blah bl\uah € € b€lah\u12blah blah
于 2020-09-25T22:02:32.430 回答
1
如果这始终是字符串的格式,请使用.split:
string = "\\u20ac €"
escaped_unicode, non_escaped_unicode = string.split()
output = '{} {}'.format(escaped_unicode.encode("utf-8").decode("unicode-escape"), non_escaped_unicode)
print(output)
# € €
如果没有,我们将需要更多的创意。我认为最通用的解决方案是仍然使用split,但然后使用正则表达式来确定我们是否需要处理转义的 unicode(假设输入足够理智,不会在同一个“单词”中混合 unicode 和转义的 unicode)
import re
string = "ac ab \\u20ac cdef €"
regex = re.compile(r'([\u0000-\u007F]+)')
output = []
for word in string.split():
match = regex.search(word)
if match:
try:
output.append(match[0].encode("utf-8").decode("unicode-escape"))
except UnicodeDecodeError:
# assuming the string contained a literal \\u or anything else
# that decode("unicode-escape") could not handle, so adding to output as is
output.append(word)
else:
output.append(word)
print(' '.join(output))
# ac ab € cdef €
于 2020-09-23T23:14:53.053 回答