Skip to main content
 首页 » 编程设计

python之正则表达式匹配无效的 Unicode 字符

2024年08月14日31emanlee

我有这样的字符串:
ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ
我想过滤掉所有这些以斜杠开头的无效字符,我正试图用 Python 中的正则表达式来做。

它确实是这样工作的:

re.sub(r",\u0f6e,", r",deleted,", s) 

但不是这样的:

re.sub(r",\.{5},", r",deleted,", s) 

它应该根据 http://pythex.org 工作,所以我想这是因为它们是无效字符?我怎样才能匹配它们?

编辑:@metatoaster 说我的问题不明确: 问题的出现似乎是因为输入字符串 s 不是原始字符串。

>>> s = ' ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ' 
>>> re.sub(r",\u0f6e,", r",deleted,", s) 
' ꐊ,ꀵ,deleted,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ' 

请您参考如下方法:

您的字符串似乎带有未定义的 Unicode 代码点。 \u0f6e 是表示为转义码的单个代码点。示例:

>>> s = 'ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ' 
>>> s 
'ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ' 
>>> print(s) 
ꐊ,ꀵ,཮,ⴗ,ꦚ,⵵,ꢯ,⾌,꥽,⩱,ㇴ,⵮,鼺, Ꞁ 

注意打印字符串如何将字符显示为未定义的框。它显示为用于调试目的的转义码。这些代码点有一些共同点。根据 Unicode 数据库,它们是 C 类(控制)代码点。他们也没有名字。一种快速过滤的方法是:

>>> ''.join(['deleted' if ud.category(c)[0] == 'C' else c for c in s]) 
'ꐊ,ꀵ,deleted,ⴗ,ꦚ,deleted,ꢯ,⾌,deleted,⩱,ㇴ,deleted,鼺,deletedꞀ'