代码之家  ›  专栏  ›  技术社区  ›  Cyker

文本和二进制模式的regex搜索是否总是返回相同的结果?

  •  0
  • Cyker  · 技术社区  · 7 年前

    蟒蛇 doc 说:

    要搜索的模式和字符串可以是Unicode字符串(str)和8位字符串(bytes)。

    但我想知道 str 和 bytes 结果总是一样的。我的意思是,这个函数是否返回真 pattern 和 string :

    #!/usr/bin/env python3
    
    import re
    def test(pattern, string):
        m = re.search(pattern, string)
        mb = re.search(pattern.encode(), string.encode())
        if m is None and mb is None: return True
        i, j = m.span(0)
        ib, jb = mb.span(0)
        return string[i:j].encode() == string.encode()[ib:jb]
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Sam Mason    7 年前

    答:没有

    例子: test('[–]', '–')

    注意,这是一个“短划线”,而不是连字符任何非ASCII字符都应具有相同的行为。

        2
  •  1
  •   Artyer    7 年前

    主要的区别是在课堂上。

    例如,u+00ff是 "ÿ" ,但不是ASCII字符。所以 \w (匹配“字字符”或字母)

    re.search(r'\w', '\xFF')  # match
    re.search(rb'\w', b'\xFF')  # no match
    re.search(rb'\w', '\xFF'.encode())  # still no match
    

    (其他Unicode字母也可以)

    如果你看看 https://docs.python.org/3/library/re.html ,您可以看到这三个类:

    \d

    对于Unicode(str)模式:

    匹配任何Unicode十进制数字(即Unicode字符类别[nd]中的任何字符)。这包括 [0-9] 以及许多其他数字字符。如果 ASCII 仅使用标志 [0-9] 是匹配的。

    对于8位(字节)模式:

    匹配ASCII字符集中被视为空白的字符;这相当于 [ \t\n\r\f\v] .

    \s

    对于Unicode(str)模式:

    匹配Unicode空白字符(包括 [\\n\r\f\v] 以及许多其他字符,例如许多语言的排版规则所规定的不间断空格)。如果 ASCII 仅使用标志 [\\n\r\f\v] 是匹配的。

    对于8位(字节)模式:

    匹配ASCII字符集中被视为空白的字符;这相当于 [\\n\r\f\v] .

    \w

    对于Unicode(str)模式:

    匹配unicode单词字符;这包括在任何语言中可以作为单词一部分的大多数字符,以及数字和下划线。如果 ASCII 仅使用标志 [a-zA-Z0-9_] 是匹配的。

    对于8位(字节)模式:

    匹配ASCII字符集中考虑的字母数字字符;这相当于 [AZ-ZO-99] . 如果 LOCALE 使用标志,匹配当前区域设置中视为字母数字的字符和下划线。

    所以如果你设置 ASCII 旗子,它们应该基本相同。

    对于您的确切函数,示例如下: test(r'\w|.', '\xFF')