这篇文章主要介绍了Python中的文本处理,包括从最基本的string模块的基础使用和更进一步的re模块的使用,本文来自IBM官方开发者技术文档,需要的朋友可以参考下
字符串 -- 不可改变的序列
如同大多数高级编程语言一样,变长字符串是 Python 中的基本类型。Python 在“后台”分配内存以保存字符串(或其它值),程序员不必为此操心。Python 还有一些其它高级语言没有的字符串处理功能。
在 Python 中,字符串是“不可改变的序列”。尽管不能“按位置”修改字符串(如字节组),但程序可以引用字符串的元素或子序列,就象使用任何序列一样。Python 使用灵活的“分片”操作来引用子序列,字符片段的格式类似于电子表格中一定范围的行或列。以下交互式会话说明了字符串和字符片段的的用法:
字符串和分片
代码语言:javascript复制>>> s =
"mary had a little lamb"
>>> s[0]
# index is zero-based
'm'
>>> s[3] =
'x'
# changing element in-place fails
Traceback (innermost last):
File
"<stdin>", line 1,
in
?
TypeError: object doesn't support item assignment
>>> s[11:18]
# 'slice' a subsequence
'little '
>>> s[:4]
# empty slice-begin assumes zero
'mary'
>>> s[4]
# index 4 is not included in slice [:4]
' '
>>> s[5:-5]
# can use "from end" index with negatives
'had a little'
>>> s[:5] s[5:]
# slice-begin & slice-end are complimentary
'mary had a little lamb'
另一个功能强大的字符串操作就是简单的 in 关键字。它提供了两个直观有效的构造: in 关键字
代码语言:javascript复制>>> s =
"mary had a little lamb"
>>>
for
c
in
s[11:18]:
print
c,
# print each char in slice
...
l i t t l e
>>>
if
'x'
in
s:
print
'got x'
# test for char occurrence
...
>>>
if
'y'
in
s:
print
'got y'
# test for char occurrence
...
got y
在 Python 中,有几种方法可以构成字符串文字。可以使用单引号或双引号,只要左引号和右引号匹配,常用的还有其它引号的变化形式。如果字符串包含换行符或嵌入引号,三重引号可以很方便地定义这样的字符串,如下例所示:
三重引号的使用
代码语言:javascript复制>>> s2 =
"""Mary had a little lamb
... its fleece was white as snow
... and everywhere that Mary went
... the lamb was sure to go"""
>>>
print
s2
Mary had a little lamb
its fleece was white as snow
and
everywhere that Mary went
the lamb was sure to go
使用单引号或三重引号的字符串前面可以加一个字母 "r" 以表示 Python 不应该解释规则表达式特殊字符。例如: 使用 "r-strings"
代码语言:javascript复制>>> s3 =
"this n and n that"
>>>
print
s3
this
and
that
>>> s4 = r
"this n and n that"
>>>
print
s4
this n
and
n that
在 "r-strings" 中,可能另外组成换码符的反斜杠被当作是常规反斜杠。在以后的规则表达式讨论中会进一步说明这个话题。
文件和字符串变量
我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。
.readline() 和 .readlines() 非常相似。它们都在类似于以下的结构中使用:
Python .readlines() 示例
代码语言:javascript复制 fh = open(
'c:\autoexec.bat')
for
line
in
fh.readlines():
print
line
.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。
如果正在使用处理文件的标准模块,可以使用 cStringIO 模块将字符串转换成“虚拟文件”(如果需要生成模块的子类,可以使用 StringIO 模块,初学者未必要这样做)。例如:
cStringIO 模块
代码语言:javascript复制>>>
import
cStringIO
>>> fh = cStringIO.StringIO()
>>> fh.write(
"mary had a little lamb")
>>> fh.getvalue()
'mary had a little lamb'
>>> fh.seek(5)
>>> fh.write(
'ATE')
>>> fh.getvalue()
'mary ATE a little lamb'
但是,请记住,cStringIO“虚拟文件”不是永久的,这一点与真正的文件不同。如果不保存它(如将它写入一个真正的文件,或者使用 shelve 模块或数据库),则程序结束时,它将消失。
标准模块:string
string 模块也许是 Python 1.5.* 标准发行版中最常用的模块。实际上,在 Python 1.6 或更高版本中,string 模块中的功能将作为内置字符串方法(在撰写本文时,详细信息尚未发布)。当然,任何执行文本处理任务的程序也许应该用以下这行开头: 开始使用 string 的方法
一般经验法则告诉我们,如果 可以 使用 string 模块完成任务,那么那就是 正确 的方法。与 re(规则表达式)相比,string 函数通常更快速,大多数情况下他们更易于理解和维护。第三方 Python 模块,包括某些用 C 编写的快速模块,适用于专门的任务,但可移植性和熟悉性都建议只要可能就使用 string。如果您习惯于使用其它语言,也会有例外,但不如您想像的那样多。
string 模块包含了几种类型的事物,如函数、方法和类;它还包含了公共常量的字符串。例如:
string 用法
代码语言:javascript复制>>>
import
string
>>> string.whitespace
'