不能在 Python 中的类字节对象上使用字符串模式

不能在 Python 中的类字节对象上使用字符串模式

Cannot use a string pattern on a bytes-like object in Python

当我们尝试使用字符串模式来匹配字节对象时,会出现 Python“TypeError: cannot use a string pattern on a bytes-like object”。

要解决该错误,请使用方法decode()解码字节对象,例如
my_bytes.decode('utf-8')

typeerror 不能在类似对象的字节上使用字符串模式

下面是错误如何发生的示例。

主程序
import re my_bytes = b'apple,banana,kiwi' # ⛔️ TypeError: cannot use a string pattern on a bytes-like object m = re.search("apple", my_bytes)

我们尝试使用字符串模式来匹配不受支持的字节对象。

将字节对象解码为字符串

解决错误的一种方法是将字节对象解码为字符串。

主程序
import re my_bytes = b'apple,banana,kiwi' m = re.search("apple", my_bytes.decode('utf-8')) print(m) # 👉️ <re.Match object; span=(0, 5), match='apple'>

bytes.decode方法返回从给定字节解码字符串。默认编码是utf-8.

现在我们使用字符串模式在字符串中查找匹配项,这是允许的。

在类字节对象上使用字节模式

或者,您可以在类似字节的对象上使用字节模式。

主程序
import re my_bytes = b'apple,banana,kiwi' # 👇️ notice b'' prefix m = re.search(b"apple", my_bytes) print(m) # 👉️ <re.Match object; span=(0, 5), match=b'apple'>

请注意,我们传递给的第一个和第二个参数re.search是字节对象。

两个参数都必须是兼容的类型,因为不允许混合字节对象和字符串。

我们以前使用过该bytes.decode()方法。但是,如果需要将字符串转换为字节对象,则必须使用该str.encode()方法。

主程序
my_str = 'bobbyhadz.com' my_bytes = my_str.encode(encoding='utf-8') print(my_bytes) # 👉️ b'bobbyhadz.com'

str.encode方法将字符串编码版本作为字节对象返回。默认编码是
utf-8.

string编码是将 a 转换为对象的过程,解码是将对象转换为 a 的过程 bytes bytesstring

检查变量的类型

如果不确定变量存储的类型,请使用内置type()类。

主程序
my_str = 'hello' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True my_bytes = b'James Doe' print(type(my_bytes)) # 👉️ <class 'bytes'> print(isinstance(my_bytes, bytes)) # 👉️ True

类型

返回对象的类型。

如果传入的对象是传入类的实例或子类,则isinstance函数返回
True