用实际符号替换 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+0000
到 U+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+100000
到 U+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 字符。
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+0000
到 U+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+100000
到 U+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 字符。