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

时间:2018-11-08 22:39:43

标签: python regex unicode null invalid-characters

我有这样的字符串:
ꐊ,ꀵ,\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Ꞁ'

2 个答案:

答案 0 :(得分:3)

似乎您有一个带有未定义Unicode代码点的字符串。 https://www.youtube.com/api/timedtext?sparams=asr_langs%2Ccaps%2Cv%2Cxoaf%2Cxorp%2Cexpire&hl=en&signature=B50CC4269D15CD954D6946B6342194EDF9F6D01F.AF819BEDE91E0F31C8F02A04508E49FC02B4F504&xorp=True&v=FSyAehMdpyI&asr_langs=ja%2Cko%2Cen%2Cde%2Cpt%2Cru%2Cnl%2Cfr%2Cit%2Ces&xoaf=1&key=yttt1&caps=asr&lang=en&fmt=srv3是表示为转义码的单个代码点。示例:

\u0f6e

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

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

答案 1 :(得分:0)

如果您的字符串是按原样定义的,我看不出您的第一个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Ꞁ'                

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