正则表达式在单词之前提取数字而忽略某些行

问题描述 投票:0回答:2

使用Python和pdf2text我试图从我收到的4000多页单页PDF文件中提取邮件和邮件 - 遗憾的是我无法访问原始文件,因此在创建文件时无法调整。

我的最终目标是使用Postalcode_ExistingFilename.pdf重命名所有PDF文件,以便我可以为邮政网络对它们进行排序。我还需要将同一客户的PDF文件合并到一个文件中,但这是另一个问题。

在PDF中,我们有“亲爱的”字样,邮政编码在此之前(尽管有几行):

04 Jul 2018

Mr Sam Sample
123 Sample Street
Sample Suburb
Sample City 1234

Dear Sam

我已经设法让它合作

(\d+)\s*Dear 

直到地址行数改变导致转换为文本以在Dear和Postcode之间添加一段文本。

04 Jul 2018

Mr Sam Sample
123 Sample Street
Sample City 1234

PO Box 1234
Sample City
Phone: 01234567
Fax: 01234568
Email: [email protected]
Website: email.com

Dear Sam

我试图从顶部开始工作并寻找不包括2018的前4位数字,但是任何4位数的街道数字都在匹配,这不是我追求的。

你能给出的任何建议都很棒。

python regex
2个回答
1
投票

您可以使用正则表达式:

\b\d{4}$\b(?<!2018)

  • \b打开单词边界。
  • \d{4}$在行尾匹配正好四位数。
  • \b关闭单词边界。
  • (?<!2018)负面观察,检查四位数字组不是2018年。

你可以试试here。正则表达式基于根据注释的假设,即邮政编码发生在行尾。如果您期望不同的年份,您可以简单地调整负面观察以应对额外的年份。例如:

  • (?<!2018|2017)将不包括2017年或2018年。
  • (?<!201[0-9])将排除2010年至2019年的年份。

根据您的Python版本,您可能需要为行断言的开始和结束指定re.MULTILINE标志。

>>> str = """04 Jul 2018

Mr Sam Sample
1235 Sample Street
Sample City 1234

PO Box 1237
Sample City
Phone: 01234567
Fax: 01234568
Email: [email protected]
Website: email.com

Dear Sam"""

>>>re.findall(r"\b\d{4}$\b(?<!2018)",str,re.MULTILINE)
['1234', '1237']

0
投票

如何尝试匹配行尾的4位数字,不包含日期的行(即以数字开头的行)?

import re
re.findall(r'^[^\d].*?\s+(\d{4})\s*$', data, re.MULTILINE)
# ['1234']
© www.soinside.com 2019 - 2024. All rights reserved.