使用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位的街道号码都被匹配了,这不是我想要的。
您可以提供的任何建议都很棒。
答案 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']