Regex匹配无效的Unicode字符



我有这样的字符串:
ꐊ,ꀵ,u0f6e,ⴗ,ꦚ,u2d75,ꢯ,⾌,ua97d,⩱,ㇴ,u2d6e,鼺,x00Ꞁ
我想过滤掉所有以斜杠开头的无效字符,我正试图用Python中的regex来实现这一点。

它确实是这样工作的:

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

但不是这样的:

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

它应该根据http://pythex.org,所以我猜是因为它们是无效字符?我该如何匹配它们?

编辑:@metatoast说我的问题模棱两可:该问题似乎是由于输入字符串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Ꞁ'

如果你的字符串真的被定义为原样,我看不出你的第一个re.sub语句会如何工作。

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

注意第一个r'u0f6e'是如何保留的。在正则表达式中,字符也是特殊的,因此也必须对其进行转义。这可以通过使用\来实现。现在试试:

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

为了匹配实际表达式,并且不超过必要的范围,请注意\u序列在0-9a-f之间正好有4个后续字符。与其试图匹配任何5个字符,不如更具体一些,比如:

>>> re.sub(r",\u[0-9a-f]+,", r",deleted,", s)                                  
' ꐊ,ꀵ,deleted,ⴗ,ꦚ,deleted,ꢯ,⾌,deleted,⩱,ㇴ,deleted,鼺,\x00Ꞁ'                

请注意,这个完整的答案假设您给我们的信息是正确的,并且转义序列实际上是反斜杠。更新您的问题以包括这些代码片段会很有用,就像我在这里所做的那样,这样可以减少对正在做的事情的歧义(因为我们可以复制粘贴您的代码并运行它来查看哪里出了问题,我们也可以更容易地纠正它(。

相关内容

  • 没有找到相关文章

最新更新