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

时间:2019-01-18 17:43:47

标签: python

Python的doc说:

  

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

但是我想知道使用strbytes进行搜索是否总是会得到相同的结果。我的意思是,对于所有有效的patternstring,此函数是否返回true:

#!/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 个答案:

答案 0 :(得分:2)

answer:否

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

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

答案 1 :(得分:1)

主要区别在于课程。

例如,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空格字符(包括[ \t\n\r\f\v]以及许多其他字符,例如,印刷规则由多种语言规定的不间断空格)。如果使用ASCII标志,则仅匹配[ \t\n\r\f\v]

  
     

对于8位(字节)模式:

     
    

匹配ASCII字符集中的空白字符;这等效于[ \t\n\r\f\v]

  
  

\w

     

对于Unicode(str)模式:

     
    

匹配Unicode单词字符;这包括可以用任何语言组成的单词的大多数字符,以及数字和下划线。如果使用ASCII标志,则仅匹配[a-zA-Z0-9_]

  
     

对于8位(字节)模式:

     
    

匹配ASCII字符集中的字母数字字符;这等效于[a-zA-Z0-9_]。如果使用LOCALE标志,则匹配当前语言环境和下划线中被视为字母数字的字符。

  

因此,如果您设置ASCII标志,则它们应该基本相同。

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