使用正则表达式将 Unicode 代码点替换为实际字符
Replace Unicode code point with actual character using regex
我有一个大文件,其中任何不在 UTF-8 中的 unicode 字符都被其在尖括号中的代码点替换(例如,“”被转换为“”)。现在我想用正则表达式替换来恢复它。
我已经尝试用
完成这个
re.sub(r'<U\+([A-F0-9]+)>',r'\U', str)
但显然这行不通,因为我们无法将组插入到此 unicode 转义中。
best/easiest 的方法是什么?我发现许多问题试图做完全相反的事情,但对 're-encode' 这些代码点作为实际字符没有任何用处...
当你有一个字符的数字时,你可以ord(number)
得到那个数字的字符。
因为我们有一个字符串,所以我们需要将其读取为 16 进制的 int。
两者加在一起:
>>> chr(int("0001F44D", 16))
''
不过,现在我们有一个小功能,不是简单替换字符串! Quick search returned that you can pass a function to re.sub
现在我们得到:
re.sub(r'<U\+([A-F0-9]+)>', lambda x: chr(int(x.group(1), 16)), my_str)
PS 不要只命名你的字符串 str
- 你会掩盖内置的 str 含义类型。
我有一个大文件,其中任何不在 UTF-8 中的 unicode 字符都被其在尖括号中的代码点替换(例如,“”被转换为“”)。现在我想用正则表达式替换来恢复它。
我已经尝试用
完成这个re.sub(r'<U\+([A-F0-9]+)>',r'\U', str)
但显然这行不通,因为我们无法将组插入到此 unicode 转义中。 best/easiest 的方法是什么?我发现许多问题试图做完全相反的事情,但对 're-encode' 这些代码点作为实际字符没有任何用处...
当你有一个字符的数字时,你可以ord(number)
得到那个数字的字符。
因为我们有一个字符串,所以我们需要将其读取为 16 进制的 int。
两者加在一起:
>>> chr(int("0001F44D", 16))
''
不过,现在我们有一个小功能,不是简单替换字符串! Quick search returned that you can pass a function to re.sub
现在我们得到:
re.sub(r'<U\+([A-F0-9]+)>', lambda x: chr(int(x.group(1), 16)), my_str)
PS 不要只命名你的字符串 str
- 你会掩盖内置的 str 含义类型。