1

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

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

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

感兴趣的模式以粗体标记):

姓,名
...什么都没有,或者可能是一些垃圾文本
   999999999 9999999 MM/DD/YY MM/DD/YY   垃圾短信
...什么都没有,或者可能是一些垃圾文本
   9999 MM/DD/YY   垃圾
我不在乎

默认情况下,我的目标文本如下所示:

一些不相​​关的文字 
DOE ,JOHN 
             200000002 100000070 04/04/13 12/12/12   XYZ IJK ABC  
             某事0999 12/22/12     0 1 0其他
更多的东西

但可能会在两者之间遇到一些事情,所以它看起来像:

一些不相​​关的文字 
DOE,约翰
第 13 页页眉
             200000002 100000070 04/04/13 12/12/12   XYZ IJK ABC  
             某事0999 12/22/12     0 1 0其他事
更多的东西

我真的不需要在这里验证太多,所以我用下面的正则表达式捕捉了三行。

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

到目前为止,我一直在使用以下三个 reg 来捕捉这些元素。表达式:

(([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})

但我想提取感兴趣的全部数据。

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

4

2 回答 2

0

在这里,我已将正则表达式添加到列表中,并尝试一个接一个地找到匹配项...这是您要查找的内容吗?

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()
于 2013-07-03T02:34:25.017 回答
0

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

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)

如果需要,可以将生成的元组列表拼接在一起,以获得所需的子字符串列表,其中删除了垃圾文本。

于 2013-07-03T03:01:17.813 回答