RSS
热门关键字:
当前位置 : 主页>编程开发>Python>列表

可爱的 Python:Python中的文本处理

来源:我要研发网 作者: 时间:1970-01-01 点击:



  与其它几种流行脚本语言一样,Python 是一种用于浏览和处理文本数据优秀工具。本文为 Python 初学者概述了 Python 文本处理工具。文章说明了规则表达式一些常规概念,并提供了处理文本时,什么情况下应使用(或不使用)规则表达式建议。 字串3

  什么是 Python?

字串2

  Python 是由 Guido van Rossum 开发、可免费获得非常高级解释型语言。其语法简单易懂,而其面向对象语义功能强大(但又灵活)。Python 可以广泛使用并具有高度可移植性。

字串9

  字符串 -- 不可改变序列

字串1

  如同大多数高级编程语言一样,变长字符串是 Python 中基本类型。Python 在“后台”分配内存以保存字符串(或其它值),程序员不必为此操心。Python 还有一些其它高级语言没有字符串处理功能。

字串8

  在 Python 中,字符串是“不可改变序列”。尽管不能“按位置”修改字符串(如字节组),但程序可以引用字符串元素或子序列,就象使用任何序列一样。Python 使用灵活“分片”操作来引用子序列,字符片段格式类似于电子表格中一定范围行或列。以下交互式会话说明了字符串和字符片段用法:

字串3

  字符串和分片

字串2

>>> 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
    "", 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'
字串6


字串3

  另一个功能强大字符串操作就是简单 in 关键字。它提供了两个直观有效构造: 字串8

  in 关键字

字串9

>>> 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
字串9

  在 Python 中,有几种方法可以构成字符串文字。可以使用单引号或双引号,只要左引号和右引号匹配,常用还有其它引号变化形式。如果字符串包含换行符或嵌入引号,三重引号可以很方便地定义这样字符串,如下例所示: 字串7

  三重引号使用

字串6

>>> 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
字串1

  使用单引号或三重引号字符串前面可以加一个字母 "r" 以表示 Python 不应该解释规则表达式特殊字符。例如: 字串4

  使用 "r-strings" 字串1

>>> s3 =
    "this
and
that"
>>>
    
     print
     s3
this
    
     and
    that
>>> s4 = r
    "this
and
that"
>>>
    
     print
     s4
this
    
     and
    
that
字串5


字串2

  在 "r-strings" 中,可能另外组成换码符反斜杠被当作是常规反斜杠。在以后规则表达式讨论中会进一步说明这个话题。 字串4

  文件和字符串变量

字串3

  我们谈到“文本处理”时,我们通常是指处理内容。Python 将文本文件内容读入可以操作字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接字符串表示,但对于连续面向行处理,它却是不必要,并且如果文件大于可用内存,则不可能实现这种处理。

字串9

  .readline() 和 .readlines() 非常相似。它们都在类似于以下结构中使用:

字串4

  Python .readlines() 示例 字串8

    fh = open(
    'c:\autoexec.bat')
    
     for
     line
    
     in
     fh.readlines():
    
     print
     line
字串5

  .readline() 和 .readlines() 之间差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行列表,该列表可以由 Python for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。

字串2

  如果正在使用处理文件标准模块,可以使用 cStringIO 模块将字符串转换成“虚拟文件”(如果需要生成模块子类,可以使用 StringIO 模块,初学者未必要这样做)。例如:

字串5

  cStringIO 模块

字串6

>>>
    
     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'
字串7

  但是,请记住,cStringIO“虚拟文件”不是永久,这一点与真正文件不同。如果不保存它(如将它写入一个真正文件,或者使用 shelve 模块或数据库),则程序结束时,它将消失。

字串3


字串5

  标准模块:string

字串7

  string 模块也许是 Python 1.5.* 标准发行版中最常用模块。实际上,在 Python 1.6 或更高版本中,string 模块中功能将作为内置字符串方法(在撰写本文时,详细信息尚未发布)。当然,任何执行文本处理任务程序也许应该用以下这行开头:

字串7

  开始使用 string 方法 字串8

   import string 字串5

  一般经验法则告诉我们,如果 可以 使用 string 模块完成任务,那么那就是 正确 方法。与 re(规则表达式)相比,string 函数通常更快速,大多数情况下他们更易于理解和维护。第三方 Python 模块,包括某些用 C 编写快速模块,适用于专门任务,但可移植性和熟悉性都建议只要可能就使用 string。如果您习惯于使用其它语言,也会有例外,但不如您想像那样多。 字串1

  string 模块包含了几种类型事物,如函数、方法和类;它还包含了公共常量字符串。例如: 字串6

  string 用法例 1

字串6

>>>
    
     import
     string
>>> string.whitespace
    '1112131415 '
>>> string.uppercase
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
字串1

  虽然可以用手写出这些常量,string 版本或多或少确保了常量对于运行 Python 脚本国家语言和平台将是正确

字串8

  string 还包括了以常见方式(可以结合这些方式来构成几种罕见转换)转换字符串函数。例如: 字串6

  string 用法例 2 字串4

>>>
    
     import
     string
>>> s =
    "mary had a little lamb"
>>> string.capwords(s)
    'Mary Had A Little Lamb'
>>> string.replace(s,
    'little',
    'ferocious')
    'mary had a ferocious lamb'
字串6

  还有许多没有在这里具体说明其它转换;可以在 Python 手册中查找详细信息。

字串6

  还可以使用 string 函数来报告字符串属性,如子串长度或位置,例如: 字串5

  string 用法例 3

字串7

>>>
    
     import
     string
>>> s =
    "mary had a little lamb"
>>> string.find(s,
    'had')5>>> string.count(s,
    'a')4
字串5


字串3

  最后,string 提供了非常 Python 化奇特事物。.split() 和 .join() 对提供了在字符串和字节组之间转换迅捷方法,您会发现它们非常有用。用法很简单:

字串3

  string 用法例 4 字串6

>>>
    
     import
     string>>> s =
    "mary had a little lamb"
>>> L = string.split(s)
>>> L
[
    'mary',
    'had',
    'a',
    'little',
    'lamb']
>>> string.join(L,
    "-")
    'mary-had-a-little-lamb'
字串8

  当然,除了 .join() 之外,也许会利用列表来做其它事(如某些涉及我们熟悉 for ... in ... 结构事情)。 字串7

  标准模块:re

字串3

  re 模块废弃了在老 Python 代码中使用 regex 和 regsub 模块。虽然相对于 regex 仍然有几个有限优点,不过这些优点微不足道,不值得在新代码中使用。过时模块可能会从未来 Python 发行版中删除,并且 1.6 版可能有一个改进接口兼容 re 模块。所以,规则表达式仍将使用 re 模块。

字串4

  规则表达式很复杂。也许有人会撰写关于这个主题书,但实际上,已经有许多人这样做了!本文尝试捕捉规则表达式“完全形态”,让读者可以掌握它。 字串9

  规则表达式是一种很简练方法,用于描述可能在文本中出现模式。是否会出现某些字符?是否按特定顺序出现?子模式是否会重复一定次数?其它子模式是否会排除在匹配之外?从概念上说,似乎不能用自然语言了直观地描述模式。诀窍是使用规则表达式简洁语法来编码这种描述。

字串4

  当处理规则表达式时,将它作为它自己编程问题来处理,即使只涉及一或两行代码;这些行有效地构成了一个小程序。

字串8

  从最小处着手。从最基本上看,任何规则表达式都涉及匹配特定“字符类”。最简单字符类就是单个字符,它在模式中只是一个字。通常,您希望匹配一类字符。可以通过将类括在方括号内来表明这是一个类;在括号中,可以有一组字符或者用破折号指定字符范围。还可以使用许多命名字符类来确定您平台和国家语言。以下是一些示例:

字串6

  字符类

字串8

>>>
    
     import
     re
>>> s =
    "mary had a little lamb"
>>>
    
     if
     re.search(
    "m", s):
    
     print
    
    "Match!"
    # char literal
Match!
>>>
    
     if
     re.search(
    "[@A-Z]", s):
    
     print
    
    "Match!"
    # char class
...
    # match either at-sign or capital letter
...
>>>
    
     if
     re.search(
    "d", s):
    
     print
    
    "Match!"
    # digits class
...
字串6


字串9

  可以将字符类看作是规则表达式“原子”,通常会将那些原子组合成“分子”。可以结合使用 分组和 循环 来完成此操作。由括号表示分组:括号中包含任何子表达式都被看作是用于以后分组或循环原子。循环则由以下几个运算符中某一个来表示:"*" 表示“零或多”;" " 表示“一或多”;"?" 表示“零或一”。例如,请看以下示例:

字串4

  样本规则表达式 字串1

ABC([d-w]*dd?) XYZ 字串9

  对于要匹配这个表达式字符串,它必须以 "ABC" 开头、以 "XYZ" 结尾 -- 但它中间必须要有什么呢?中间子表达式是 ([d-w]*dd?),而且后面跟了“一或多”运算符。所以,字符串中间必须包括一个(或者两个,或者一千个)与括号中子表达式匹配字符或字符串。字符串 "ABCXYZ" 不匹配,因为它中间没有必要字符。 字串7

  不过这个内部子表达式是什么呢?它以 d-w 范围内 零或多个 字母开头。一定要注意:零字母是有效匹配,虽然使用英语单词 "some"(一些)来描述它,可能会感到很别扭。接着,字符串必须 恰有一个数字;然后有 零或一个 附加数字。(第一个数字字符类没有循环运算符,所以它只出现一次。第二个数字字符类有 "?" 运算符。)总而言之,这将翻译成“一个或两个数字”。以下是一些与规则表达式匹配字符串:

字串3

  匹配样本表达式字符串 字串9

ABC1234567890XYZ
ABCd12e1f37g3XYZ
ABC1XYZ
字串4

  还有一些表达式与规则表达式 不匹配(想一想,它们为什么不匹配):

字串8

  不匹配样本表达式字符串 字串3

ABC123456789dXYZ
ABCdefghijklmnopqrstuvwXYZ
ABcd12e1f37g3XYZ
ABC12345g890XYZ
ABCD12E1F37G3XYZ
字串4

  需要一些练习才能习惯创建和理解规则表达式。但是,一旦掌握了规则表达式,您就具有了强大表达能力。也就是说,转而使用规则表达式解决问题通常会很容易,而这类问题实际上可以使用更简单(而且更快速)工具,如 string,来解决。

字串6

字串4

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章