繁体   English   中英

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

[英]Regex match invalid Unicode characters

我有这样的字符串:
ꐊ,ꀵ,\཮,ⴗ,ꦚ,\⵵,ꢯ,⾌,\꥽,⩱,ㇴ,\⵮,鼺,\\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代码点的字符串。 \཮是表示为转义码的单个代码点 例:

>>> 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'\཮'保留。 在正则表达式中, \\字符也很特殊,因此也必须转义。 可以使用\\\\代替。 现在尝试:

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

为了匹配实际表达式且不超过实际数量,请注意\\\\u\u003c/code>序列在0-9af之间具有正好4个后续字符。 与其匹配任何5个字符,不如说更具体,例如:

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

请注意,此完整答案假设您提供给我们的信息是正确的,转义序列实际上是反斜杠字符。 更新您的问题以包含这些代码片段(如我在这里所做的事情那样不那么模棱两可)会很有用(因为我们可以复制粘贴您的代码并运行它以查看出了什么问题,并且我们也可以更正它容易)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM