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

时间:2013-07-03 01:51:28

标签: python regex

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

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

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

感兴趣的模式标记为 BOLD ):

LAST NAME   ,FIRST NAME
... nothing or possibly some junk text
   999999999  9999999  MM/DD/YY  MM/DD/YY   junk text
... nothing or possibly some junk text
   9999    MM/DD/YY   junk
I dont care

默认情况下,我的目标文字类似于:

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

但是可能会遇到介于两者之间的东西,所以它看起来像:

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

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

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

到目前为止,我已经通过以下三个注册来捕获这些元素。表达式:

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

但我想提取感兴趣的整个数据。

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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)

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