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

时间:2018-07-09 11:02:58

标签: python regex

使用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和邮政编码之间添加了一块文本。

04 Jul 2018

Mr Sam Sample
123 Sample Street
Sample City 1234

PO Box 1234
Sample City
Phone: 01234567
Fax: 01234568
Email: email@email.com
Website: email.com

Dear Sam

我试图从顶部开始进行这项工作,并寻找除2018之外的前4位数字,但是任何4位的街道号码都被匹配了,这不是我想要的。

您可以提供的任何建议都很棒。

2 个答案:

答案 0 :(得分: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@email.com
Website: email.com

Dear Sam"""

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

答案 1 :(得分:0)

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

import re
re.findall(r'^[^\d].*?\s+(\d{4})\s*$', data, re.MULTILINE)
# ['1234']