Python的doc说:
要搜索的模式和字符串都可以是Unicode字符串(str)以及8位字符串(字节)。
但是我想知道使用str
和bytes
进行搜索是否总是会得到相同的结果。我的意思是,对于所有有效的pattern
和string
,此函数是否返回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]
答案 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')