≡菜单

如何使用Python正则表达式解析文本文件(带有Python Reg-Ex Re Split Sub的实用用例场景)

在Python系列的前几篇文章中,我们’我已经学到了很多有关在Python中使用正则表达式的知识。

在本文中,我们’ll解释如何在实际任务中使用python正则表达式。

We’我将逐步介绍如何从格式化的纯文本文件构建Python数据结构。

如果您不熟悉Python正则表达式,则以下两篇文章会有所帮助:

  1. python reg-ex入门 使用重新匹配搜索findall
  2. 高级python reg-ex示例 –多行,替换,贪婪/非贪婪匹配

在本文中,我们的示例以一些格式化的纯文本开头。此数据可能来自一个文本文件,其中包含约会网站的个人资料信息:

>>> 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>

但是,描述可以跨越多行,并且每个配置文件至少由一个空白行分隔。我们可以使用‘re’打包以处理此原始文本。首先,我们将每个配置文件分开:

>>> 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,}’说要匹配至少2个换行符,但是因为我们没有’如果指定上限,则序列可以任意长。这对应于文本格式。请记住,我们说过每个配置文件至少要用一个空白行(即2个连续的换行符)分隔。

现在,我们有了原始配置文件的列表。在执行其他任何操作之前,请注意散布在配置文件中的流浪换行符。这些是由于配置文件可以跨越多条线的事实而导致的。现在我们’我只会用它们代替‘ ‘使用sub()方法的字符:

>>> 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()方法执行此操作。 (有关python列表推导的更多详细信息,请参阅我之前关于该主题的文章(您可以在此处放置链接吗?))

>>> 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()方法将描述保持不变(即使它们包含‘,’字符)。 maxsplit参数告诉split()最多执行许多拆分,无论找到多少匹配项。在我们的例子中,我们告诉split()仅将字符串拆分为前2个‘,’字符(即创建3个字段)。

我们的例子确实在进步。我们’现在,我们获得了一个用户配置文件列表,每个用户配置文件都细分为一个’的指定字段。但是,数据比较混乱,我们的配置文件中散布了一些空白。

让’s clean this up:

>>> 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()函数接受一个函数和一个列表,并将该函数应用于列表的每个元素。在我们的例子中,应用字符串’s strip()方法访问配置文件的每个字段。有关更多信息,请访问官方 Python re文档.

我们的例子已经结束了。我们已经成功地构造了用户个人资料数据。

我们可以轻松地获取此列表,并使用它在系统中实例化User Profile对象,在网页上显示用户个人资料或将个人资料数据保存在数据库中。

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 3 评论 … 加一 }

  • 麦克风 2014年10月7日,上午11:03

    这是最有帮助的。谢谢。

  • 阿曼多 2014年11月26日,上午8:29

    如果文本在文件中,而又不必读取内存中的整个文件,该怎么办?例如。说明可能很长,文件很大,等等。有没有办法不读取内存中的文件块?

  • 爱丽儿 2017年4月30日,上午1:41

    您如何将结果导出到CSV?

    谢谢

发表评论