Python 正则表达式在忽略某些行的情况下提取单词前的数字

Python 正则表达式在忽略某些行的情况下提取单词前的数字,python,regex,Python,Regex,使用Python和pdf2text,我试图从收到的4000多个单页PDF文件中提取一个邮政编码,以便打印和邮寄-不幸的是,我无法访问原始文件,因此无法在创建文件时进行调整 我在这里的最终目标是用Postalcode_ExistingFilename.PDF重命名所有PDF文件,以便我可以根据邮政网络对它们进行排序。我还需要将同一客户的PDF合并到一个文件中,但这是另一个问题 在PDF中,我们有“亲爱的”一词,邮政编码在前面(尽管有几行): 我已经设法让它工作了 (\d+)\s*Dear 直到

使用Python和pdf2text,我试图从收到的4000多个单页PDF文件中提取一个邮政编码,以便打印和邮寄-不幸的是,我无法访问原始文件,因此无法在创建文件时进行调整

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

在PDF中,我们有“亲爱的”一词,邮政编码在前面(尽管有几行):

我已经设法让它工作了

(\d+)\s*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位数字的街道号码都是匹配的,这不是我想要的


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

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


您可以使用正则表达式:

\b\d{4}$\b(?)

  • \b
    打开单词边界
  • \d{4}$
    在行尾精确匹配四位数字
  • \b
    关闭单词边界
  • (?负回溯,检查四位数字组是否为空
您可以在现场试用。根据评论,正则表达式基于邮政编码出现在行尾的假设。如果您预期的年份不同,您可以简单地调整负回溯以处理其他年份。例如:

  • (?将不包括2017年或2018年

  • (?将不包括从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']
>str=”“”2018年7月4日
山姆先生
样本街1235号
样本城市1234
邮政信箱1237
样本城市
电话:01234567
传真:01234568
电邮:email@email.com
网站:email.com
亲爱的山姆:

>>>re.findall(r“\b\d{4}$\b(?Try
\b\d{4}\b(?),这将排除2018年的匹配。您的文件中是否还有其他年份?
(\d{4})\n{2}(+\n)+\nDear
邮政编码位于第1组。感谢@pkpkpk的快速回复。如果地址也是4位数字,即1920样本街,那么这似乎是错误的。如果从上往下看,地址中也可能出现其他号码,但至少知道亲爱的路线。@joshlindsay是始终位于lin末尾的邮政编码e、 而地址不是?如果是,请尝试
\b\d{4}$\b(?你已经搞定了@pkpk.Legend!有一些异常需要手动处理,但完全可行。谢谢。哦,太接近了。直到我在邮箱10376中找到地址。是否可以显式声明4位数字?更新..现在应该只匹配4位@pkpk。非常感谢这一点。我今天实现了它,但它的工作非常简单PDF的版本在邮政编码后有一个空格。我以为我解决了它,但在没有邮政编码的地方,它进一步查找文档并找到了另一个4位数字。在仍然查找行尾+一个空格时,是否还要附加表达式以考虑到这一点?欢迎您。尝试此
re.findall(r)(\b\d{4(?)?
import re
re.findall(r'^[^\d].*?\s+(\d{4})\s*$', data, re.MULTILINE)
# ['1234']
>>> 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']