python3中受到字符串影响的4种主要的工具:re模式匹配模块、struct二进制数据模块、pickle对象序列化模块和用于解析XML文本的xml包。
re模式匹配模块:
在Python 3.0中的引用,从一行文本提取子字符串。在模式字符串中,(.*)表示任何字符(.)、0或多次(*)、,作为一个匹配的子字符串单独保存(())。在成功匹配之后,根据包含在圆括号中的模式部分而匹配的字符串部分就可以使用,通过group或groups方法:
直接通过代码来说明:
#python3版本 >>> import re >>> S = 'Bugger all down here on earth!' >>> B = b'Bugger all down here on earth!' >>> re.match('(.*) down (.*) on (.*)', S).groups() ('Bugger all', 'here', 'earth!') >>> re.match(b'(.*) down (.*) on (.*)', B).groups() (b'Bugger all', b'here', b'earth!') ''' Python 2.6中的结果是类似的,但是,unicode类型用于非ASCII文本,并且str处理8位的和二进制文本: ''' #python2.7.5版本 >>> import re >>> S = 'Bugger all down here on earth!' >>> U = u'Bugger all down here on earth!' >>> re.match('(.*) down (.*) on (.*)', S).groups() ('Bugger all', 'here', 'earth!') >>> re.match('(.*) down (.*) on (.*)', U).groups() (u'Bugger all', u'here', u'earth!')
struct二进制数据模块:
Python的struct模块,用来从字符串创建和提取打包的二进制数据,它在Python 3.0中也像在Python 2.X中一样工作,但是,打包的数据只是作为bytes和bytearray对象显示,
而不是str对象。
pickle对象序列化模块
xml包
总结:
1. Python 3.0有3种字符串类型:str(用于Unicode文本,包括ASCII)、bytes(用于带有绝对字节值的二进制数据)和bytearray(bytes的一种可变的形式)。str类型通常表示存储在文本文件中的内容,其他的两种形式通常表示存储在二进制文件中的内容。
2. Python 2.6有两种主要的字符串类型:str(用于8位文本和二进制数据)以及unicode(用于宽字符文本)。str类型用于文本和二进制文件内容,unicode用于通常比8位更复杂的文本文件内容。Python 2.6(但不包括更早的版本)也有Python3.0的bytearray类型,但它主要是一种向后兼容,而且并没有表现出Python 3.0中所表现出来的鲜明的文本/二进制区别。
3. 从Python 2.6到Python 3.0的字符串类型对应并不是直接的,因为Python 2.6的str等同于Python 3.0中的str和bytes,并且Python 3.0中的str等同于Python 2.6中的str和unicode。Python 3.0中bytearray的可变性是唯一的。
4. Python 3.0的字符串类型共享了几乎所有相同的操作:方法调用、序列操作,甚至像模式匹配这样以相同方式工作的更大工具。另一方面,只有str支持字符串格式操作,并且bytearray有一组额外的操作来执行原处修改。Str和bytes类型也分别拥有编码和解码文本的方法。
5. 非ASCII Unicode字符可以以十六进制转移(\xNN)和Unicode转义(\uNNNN,\UNNNNNNNN)编写到一个字符串中。在某些键盘上,一些非ASCII字符——例如,某些Latin-1字符,也可以直接录入。
6. 在Python 3.0中,文本模式文件假设其文件内容是Unicode文本(即便它是ASCII),并且当读取的时候自动解码,写入的时候自动编码。对于二进制模式的文件,bytes和文件之间不经修改地转换。文本模式文件的内容通常在脚本中表示为str对象,并且二进制文件的内容表示为bytes(或bytearray)对象。文本模式文件也针对特定编码类型处理bytearray,并且输入和输出时自动在行末序列与单个\n之间转换,除非显式地关闭这一功能。二进制模式的文件不会执行任何这样的步骤。
7. 要读取和平台默认编码方式不同的方式编码的文件,直接把文件编码名传递给Python 3.0的内置函数open(在Python 2.6中是codecs.open());当从文件读取数据的时候,数据将针对每种特定编码来解码。我们也可以在二进制模式中读取,并且通过给定一个编码名来手动地把字节解码成一个字符串,但是,这涉及额外的工作,并且对于多字节字符更容易出错(可能偶尔要读取字节序列的一部分)。
8. 要以特定编码格式创建一个Unicode文本文件,把想要的编码名称传递给Python 3.0中的open(在Python 2.6中是codecs.open())。当字符串写入文件中的时候,将会
按照每个想要的编码来进行编码。也可以手动把一个字符串编码为字节,并在二进制模式下将其写入,但是,这通常需要额外的工作。
9. ASCII文本看作是一种Unicode文本,因为其7位范围值只是大多数Unicode编码的一个子集。例如,有效的ASCII文本也是有效的Latin-1文本(Latin-1只是把一个8
位字节中其余可能的值分配给额外的字符),并且是有效的UTF-8文本(UTF-8为表示更多的字符定义了一个变量-字节方案,但是ASCII字符仍然用同样的代码表
示,即单个的字节)。
10. Python 3.0的字符串类型修改的影响,取决于你所使用的字符串的类型。对于那些使用简单ASCII文本的脚本,可能根本没有影响:在此情况下,str字符串类型在Python 2.6和Python 3.0中的用法相同。此外,尽管标准库中像re、struct、pickle和xml这样字符串相关的工具可能在Python 3.0和Python 2.6中技术上的用法不同,但这一修改很大程度上与大多数程序不相关,因为Python 3.0的str和bytes以及Python 2.6的str都支持几乎相同的接口。如果你处理Unicode数据,只需要直接把Python 2.6的工具集unicode和codecs.open()转换为Python 3.0的str和open。如果你处理二进制数据文件,将需要处理作为bytes对象的内容。由于它们与Python 2.6字符串具有相似的接口,所以影响再次变得很小。
浙公网安备 33010602011771号