代码之家  ›  专栏  ›  技术社区  ›  J Alan

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

  •  2
  • J Alan  · 技术社区  · 6 年前


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

    它确实是这样工作的:

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

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

    它应该按照 http://pythex.org ,所以我猜是因为它们是无效字符?我怎样才能匹配它们?

    编辑: 问题似乎是因为输入字符串 s 不是原始字符串。

    >>> s = ' ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
    >>> re.sub(r",\u0f6e,", r",deleted,", s)
    ' ꐊ,ꀵ,deleted,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Mark Tolonen    6 年前

    \u0f6e 是一个 单代码点 表示为转义码。例子:

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

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

    我不知道你的第一次 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-9 a-f

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

    请注意,整个答案假设您提供的信息是正确的,转义序列实际上是反斜杠字符。更新您的问题以包含这些代码片段会很有用,就像我在这里所做的那样,这样可以减少对正在执行的操作的模糊性(因为我们可以复制粘贴您的代码并运行它来查看出错的地方,我们还可以更容易地更正它)。