【问题标题】:Using Python Regex to Automate Text Extraction使用 Python 正则表达式自动提取文本
【发布时间】:2017-08-26 18:29:01
【问题描述】:

我正在从事一个自动化项目,该项目涉及使用解析 txt 文件并重复提取关键字后的 3 行数据的 python 脚本。为了给出上下文,txt 文件包含数百个相同的格式字母,除了末尾的名称和地址。我的最终目标是遍历所有这些套用信函,提取姓名和地址,然后使用 openpyxl 将它们放入 Excel 电子表格中。下面是一个txt文档长什么样子的例子……

Dear Sir,

Body of letter that is the same for all of the letters. Etc.

Sincerely,

Mr. John Smith
123 Any Street
Anytown, USA 11111

Dear Sir,

Body of letter that is the same for all of the letters. Etc.

Sincerely,

[Ms.] [Jane] [Doe]
[456 Some Lane]
[Sometown, USA 22222]

等等。 (这些字母以不同的名称不断出现,需要提取)


我的问题是如何在 python 中使用正则表达式来设置“最后一个单词关键字”(在这批特定的字母“真诚”中,但可以在另一个单独的 txt 文件中更改为“问候”之类的其他内容)并提交记住上面显示的每个括号中的项目(括号对应于最终的 Excel 列,如后缀、名字、姓氏、地址、城镇)并逐个遍历数百个字母?一般来说,使用 regex 或 python 这样做很简单吗?我想我可以为一个字母做到这一点,但我被困在如何继续下一个字母的下一个结尾关键字。如果有人对解决此问题的最有效方法有任何想法,我将不胜感激!另外,我知道发布我最初解决问题的方法是一种习惯,但是对正则表达式操作完全不熟悉,我的尝试甚至没有接近。另外,如果我是新来的,如果我在 Stack Overflow 问题上做一些非正统的事情,请告诉我。


示例输入:字母 input.txt
2017 年 3 月 30 日收到的电子邮件:

Dear Sir,

I would be delighted to be placed on your mailing list. Please keep up the great work!

Sincerely,

Mr. Thomas Dahlmer
46 Alpine Street
Evanston, Il 60201

2017 年 3 月 30 日收到的电子邮件:

尊敬的先生,

我很高兴被列入您的邮寄名单。请继续努力!

此致,

先生。罗伯特·诺兰
麦迪逊大道 1104 号
纽约,纽约 10021

2017 年 3 月 30 日收到的电子邮件:

Dear Sir,

I would be delighted to be placed on your mailing list. Please keep up the great work!

Sincerely,

Ms. Angela Carraway <br/>
402 Arlington Drive <br/>
Concord, MA 01742

示例输出
字母输出.txt

Mr. Thomas Dahlmer <br/>
46 Alpine Street <br/>
Evanston, Il 60201

Mr. Robert Nolan <br/>
1104 Madison Avenue <br/>
New York, NY 10021

Ms. Angela Carraway <br/>
402 Arlington Drive <br/>
Concord, MA 01742

【问题讨论】:

  • 你想要一个正则表达式来捕获这些吗?如果是这样,请给出一个示例输入和所需的输出,以便我可以提供一个经过测试的正则表达式。
  • @Saibot 本质上是的。我已经编辑了我的问题,以包括两个 txt 文件中的示例输入和输出内容。感谢您提供有关这方面的任何见解!

标签: regex excel python-3.x automation


【解决方案1】:

有点长:Sincerely,[\s\n]+([\w\.]+)\s+(\w+)\s+(\w+)[\s\n]+(\d+\s\w+\s\w+)[\s\n]+(\w+\s?\w+,\s\w+\s\d+)

它捕获为 5 个组:Title、Firstname、Lastname、Address1、Address2

演示:https://regex101.com/r/kkNWWB/3

有五个括号,每个括号代表一个捕获组:

([\w\.]+) 匹配并捕获第一组:标题

(\w+) 匹配并捕获第二组:Firstname

(\w+) 匹配并捕获第三组:姓氏

(\d+\s\w+\s\w+) 匹配并捕获第四组:Address1

(\w+\s?\w+,\s\w+\s\d+)匹配并捕获第五组:Address2

正则表达式的其余部分只是填补了捕获组之间的空白,它们只匹配但不捕获。

【讨论】:

  • 就是这样!我非常感谢你的帮助。我一定会学习演示,以了解您的专业知识以及每个部分的含义。正则表达式无疑是一个强大的工具!
  • 享受吧! :) 如果你想学习我也可以解释表达式。
  • 是的,那太好了!据我了解,这些字母运算符对捕获文本各有不同的影响,但它们如何协同工作以得出您找到的最终结果?
  • 也感谢您的解释。我对发生的事情肯定有更深入的了解!
猜你喜欢
  • 1970-01-01
  • 2021-12-12
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多