用实际符号替换 Unicode 字符

Replacing Unicode Characters with actual symbols

string = "At Donald Trump<U+2019>s Properties, a Showcase for a Brand and a President-Elect"

我想去掉 <U + 2019> 并将其替换为 '。在 python 中有没有办法做到这一点?

编辑:我还有 等实例。寻找可以用适当值替换所有这些的东西

您使用的 python 是什么版本?

我编辑了我的答案,以便它可以与同一字符串中的多个代码点一起使用

你需要将 < > 之间的 unicode 代码点转换为 unicode char

我用regex得到了unicode的code point,然后转换成对应的uniode char

import re

string = "At Donald Trump<U+2019>s Properties, a Showcase for a Brand and a President<U+2014>Elect"

repbool = re.search('[<][U][+]\d{4}[>]', string)

while repbool:
  rep = re.search('[<][U][+]\d{4}[>]', string).group()
  
  string=string.replace(rep, chr(int(rep[1:-1][2:], 16)))
 
  repbool = re.search('[<][U][+]\d{4}[>]', string)
  

print(string)

您可以使用 .replace()

替换
print(string.replace('<U+2019>', "'"))

或者如果您的年份发生变化,您可以使用 re。但是让它比我的更有吸引力。

import re

string = "At Donald Trump<U+2019>s Properties, a Showcase for a Brand and a President-Elect"

rep = re.search('[<][U][+]\d{4}[>]', string).group()

print(string.replace(rep, "'"))

我想如果只是这些字符中的一两个就可以解决问题。

>>> string = "At Donald Trump<U+2019>s Properties, a Showcase for a Brand and a President-Elect"
>>> string.replace("<U+2019>","'")
"At Donald Trump's Properties, a Showcase for a Brand and a President-Elect"

如果要完成这些替换的次数很多,请考虑使用'map()'方法。
资料来源:Removing \u2018 and \u2019 character

这是我对从 U+0000U+10FFFF 表示的所有代码点的解决方案(“U+”后跟十六进制代码点值,前导零至少为四位数字):

import re
def UniToChar(unicode_notation):
    return chr(int(re.findall(r'<U\+([a-hA-H0-9]{4,5})>',unicode_notation)[0],16))

xx= '''
At Donald<U+2019>s <U+2016>Elect<U+2016> in <U+2017>2019<U+2017>
<U+00C0> la Donald<U+2019>s friend <U+1F986>. <U+1F929><U+1F92A><U+1F601>
'''
for x in xx.split('\n'):
    abc =  re.findall(r'<U\+[a-hA-H0-9]{4,5}>',x)
    if len(abc) > 0:
        for uniid in set(abc): x=x.replace(uniid, UniToChar(uniid))
    
    print(repr(x).strip("'"))

输出71307293.py

At Donald’s ‖Elect‖ in ‗2019‗
À la Donald’s friend . 

事实上,使用上述简化的正则表达式未检测到从 U+100000U+10FFFD(平面 16)的私人范围......改进代码如下:

import re
def UniToChar(unicode_notation):
    aux = int(re.findall(r'<U\+([a-hA-H0-9]{4,6})>',unicode_notation)[0],16)
    # circumvent the "ValueError: chr() arg not in range(0x110000)"
    if aux <= 0x10FFFD:
        return chr(aux)
    else:
        return chr(0xFFFD) # Replacement Character

xx= '''
At Donald<U+2019>s <U+2016>Elect<U+2016> in <U+2017>2019<U+2017>
<U+00C0> la Donald<U+2019>s friend <U+1F986>. <U+1F929><U+1F92A><U+1F601>
Unassigned: <U+05ff>; out of Unicode range: <U+110000>.
'''
for x in xx.split('\n'):
    abc =  re.findall(r'<U\+[a-hA-H0-9]{4,6}>',x)
    if len(abc) > 0:
        for uniid in set(abc): x=x.replace(uniid, UniToChar(uniid))
    
    print(repr(x).strip("'"))

输出:71307293.py

At Donald’s ‖Elect‖ in ‗2019‗
À la Donald’s friend . 
Unassigned: \u05ff; out of Unicode range: �.

一次性全部替换为re.sub:

import re

string = "testing<U+2019> <U+2014> <U+201C>testing<U+1F603>"

result = re.sub(r'<U\+([0-9a-fA-F]{4,6})>', lambda x: chr(int(x.group(1),16)), string)
print(result)

输出:

testing’ — “testing

正则表达式匹配<U+hhhh>,其中hhhh可以是4-6个十六进制字符。请注意,Unicode 定义了从 U+0000 到 U+10FFFF 的代码点,因此这说明了这一点。 lambda 替换函数使用 base 16 将字符串 hhhh 转换为整数,然后将该数字转换为 Unicode 字符。