如何使用 Python 正则表达式解析文本文件

Tags: python regex

正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个 句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

在我们日常工作(或学习中)我们都使用过或接触过正则表达式,在这篇文章中,我们将会介绍在真实场景中使用 Python 语言正则表达式的例子。

如果你第一次接触 Python 正则表达式,请参考下面两篇文章:

深入 Python 正则表达式

Python 正则表达式例子 - Re Match Search FindAll

在这篇文章中,我们将从一个格式化纯文本文档开始。文档中包含一个交友网站的个人资料信息:

>>> rawProfiles = '''
... Tim Fake, 1982/03/21, I like to
... eat, sleep and
... relax
... 
... Lisa Test, 1990/05/12, I like long
... walks of the beach, watching sun-sets,
... and listening to slow jazz
... '''
>>>

文本的格式是:

<name>, <birth-date>, <description>

其中,'description' 字段可以换行,每一个个人信息使用一个空行作为分隔。我们可以使用 re 包的 split() 方法来解析这原始文本。首先,我们将分割每个个人信息:

>>> profilesList = re.split(r'\n{2,}', rawProfiles)
>>> profilesList
['\nTim Fake, 1982/03/21, I like to\neat, sleep and\nrelax', ' Lisa Test, 1990/05/12, I like long\nwalks of the beach, watching sun-sets,\nand listening to slow jazz \n']

{} 用来指定重复的次数,在我们的例子中 \n{2,} 的意思是:最少联系两个换行符,由于我们没有指定上限,因此而已匹配任意多的换行符,这与文档的格式是相关的。我们的文章以至少一个换行符来分割每个个人信息。

现在我们有了一个个人原始个人信息的列表了,不过在我们使用它们之前,需要先处理一下文本中的换行符。目前我们只需要使用 sub() 方法将换行符 \n 替换为 '' 即可,参考下面代码:

>>> profilesList = [ re.sub(r'\n', ' ', profile) for profile in profilesList ]
>>> profilesList
[' Tim Fake, 1982/03/21, I like to eat, sleep and relax', ' Lisa Test, 1990/05/12, I like long  walks of the beach, watching sun-sets, and listening to slow jazz  ']

然后,我们可以将文档解析到各个字段中,我们可以使用匹配和分组来实现这个功能,不过这次我打算使用 split() 方法来完成同样的事情。

>>> profilesList = [ re.split(r',', profile, maxsplit=2) for profile in profilesList ]
>>> for profile in profilesList:
...    print profile
... 
[' Tim Fake', ' 1982/03/21', ' I like to eat, sleep and relax']
[' Lisa Test', ' 1990/05/12', ' I like long  walks of the beach, watching sun-sets, and listening to slow jazz  ']

注意上面例子中我们指定了 maxsplit 参数,split() 方法没有处理 description(个人描述) 部分(即使该部分也包含 ',' 字符)。maxsplit 参数告诉 split() 函数执行时无论有多少个匹配时最多分隔多少次。我们的代码中制定了分隔','字符两次。

我们的示例可以运行了,我们已经有了一个用户个人信息列表,并且每个信息项也保存到对应的字段中了。然而,数据有些不规范,因为数据中有很多不需要的空格,让我们清理掉:

>>> profilesList = [ map(str.strip, profile) for profile in profilesList ]
>>> for profile in profilesList:
...    print profile
... 
['Tim Fake', '1982/03/21', 'I like to eat, sleep and relax']
['Lisa Test', '1990/05/12', 'I like long   walks of the beach, watching sun-sets,  and listening to slow jazz']

Python 标准库中的 map() 函数需要两个参数:一个函数、和一个列表,它会将函数应用到列表中的每一项上。在我们的例子中,会将 string 的 strip() 函数应用到个人信息的每个字段中。更多信息请参考 python 的相关文档

这个例子已经完成,我们成功的将文本文件转换为我们的 Python 数据结构,我们可以很方便的使用这个列表来初始化 User Profile 对象,将他们显示在网页中,或保存在数据库里。

本文链接:http://www.4byte.cn/learning/88473/ru-he-shi-yong-python-zheng-ze-biao-da-shi-jie-xi-wen-ben-wen-jian.html



相关文章