python中的正则表达式,它在多行上查看模式

python中的正则表达式,它在多行上查看模式,python,regex,Python,Regex,我正在从包含超过三行或更多行的感兴趣信息的文件中提取记录。信息是有序的,它遵循一个合理的模式,但它是可以的 中间有一些样板文本 由于这是一个从PDF转换而来的文本文件,因此也有可能存在页码或其他简单的控制元素 模式包括: 起始行:姓和名之间用逗号分隔,没有其他内容 下一行将有两个长数字(>=7位),后跟两个日期 最后一行利息将有4位数字,后跟日期 感兴趣的模式用粗体标记: 姓、名 ... 没有,或者可能是一些垃圾文本 999999999999999999999mm/DD/YY MM/DD/YY垃

我正在从包含超过三行或更多行的感兴趣信息的文件中提取记录。信息是有序的,它遵循一个合理的模式,但它是可以的 中间有一些样板文本

由于这是一个从PDF转换而来的文本文件,因此也有可能存在页码或其他简单的控制元素

模式包括: 起始行:姓和名之间用逗号分隔,没有其他内容
下一行将有两个长数字(>=7位),后跟两个日期
最后一行利息将有4位数字,后跟日期

感兴趣的模式用粗体标记:

姓、名 ... 没有,或者可能是一些垃圾文本 999999999999999999999mm/DD/YY MM/DD/YY垃圾文本 ... 没有,或者可能是一些垃圾文本 9999毫米/日/年 我不在乎 默认情况下,我的目标文本如下所示:

SOME IRRELEVANT TEXT DOE ,JOHN 200000002 100000070 04/04/13 12/12/12 XYZ IJK ABC SOMETHING SOMETHING 0999 12/22/12 0 1 0 SOMETHING ELSE MORE OF SOMETHING ELSE 一些无关的文本 DOE,JOHN 2000000210000007004/04/1312/12/12XYZ IJK ABC某物 099912/22/120110其他 更多的是别的 但在这两者之间可能会遇到某种情况,因此看起来:

SOME IRRELEVANT TEXT DOE ,JOHN Page 13 Header 200000002 100000070 04/04/13 12/12/12 XYZ IJK ABC SOMETHING SOMETHING 0999 12/22/12 0 1 0 SOMETHING ELSE MORE OF SOMETHING ELSE 一些无关的文本 DOE,JOHN 第13页页眉 2000000210000007004/04/1312/12/12XYZ IJK ABC某物 099912/22/120110其他 更多的是别的 我真的不需要在这里验证太多,所以我用下面的正则表达式捕捉三行代码

因为我知道这个模式将作为子字符串出现,但是可能会插入

到目前为止,我已经用以下三种方法捕捉到了这些元素。表达方式:


(([A-Z]+\s+,[A-Z]+)
(\d{7,}\s+\d{7,}\s+(\d{2}/\d{2}/\d{2}\s+{2})
(\d{4}\s+\d{2}/\d{2}/\d{2})

但我想提取所有感兴趣的数据


这可能吗?如果可能,怎么可能?

在这里,我将正则表达式添加到列表中,并尝试一个接一个地查找匹配项。。。你是在找这个吗

import re

f = open("C:\\Users\\mridulp\\Desktop\\temp\\file1.txt")
regexpList = [re.compile("(([A-Z]+\s+)+,[A-Z]+)"),
              re.compile("^.*(\d{7,}\s+\d{7,}\s+(\d{2}/\d{2}/\d{2}\s+){2})"),
              re.compile("^.*(\d{4}\s+\d{2}/\d{2}/\d{2}).*")]
lines = f.readlines()
i = 0
for l in lines:
    mObj = regexpList[i].match(l)
    if mObj:
        print mObj.group(1)
        i = i + 1
    if i > 2:
        i = 0

f.close()

这将为您从较大字符串中提取所需子字符串的所有实例:

re.findall('([A-Z]+\s+,[A-Z]+).+?(\d+\s+\d+\s+\d{2}\/\d{2}\/\d{2}\s+\d{2}\/\d{2}\/\d{2}).+?(\d+\s+\d{2}\/\d{2}\/\d{2})', x, re.S)

如果需要,可以将结果元组列表缝合在一起,以获得删除垃圾文本的所需子字符串列表。

?为什么不将所有文本连接在一行中?文件长度可以是千兆字节这是我目前拥有的
re.findall('([A-Z]+\s+,[A-Z]+).+?(\d+\s+\d+\s+\d{2}\/\d{2}\/\d{2}\s+\d{2}\/\d{2}\/\d{2}).+?(\d+\s+\d{2}\/\d{2}\/\d{2})', x, re.S)