2013-07-03 62 views
1

我從具有感興趣的信息的文件中提取記錄超過三行或更多行。信息是按順序排列的,它遵循一個合理的模式,但是 之間可以有一些樣板文字。Python中的正則表達式在多行中查看模式

由於這是從PDF轉換而來的文本文件,所以也可能存在頁碼或其他一些簡單的控制元素。

模式包括: 起跑線:後面兩個日期姓氏和用逗號分隔的名字,沒有別的
下一行有兩個長數(> = 7位數)
感興趣最後一行有後跟的日期

的利益格局被標記爲BOLD)4位數字:

 
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 

我不真的需要在這裏多驗證,所以我抓住三條線有以下正則表達式。

因爲我知道,這種格局將發生作爲一個子字符串,但可能插入

到目前爲止,我一直在追趕與以下三個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})

,但我想提取所關注整個數據。

這是可能的,如果是這樣,如何?

+2

http://docs.python.org/2/library/re.html#re.MULTILINE – Elazar

+0

[Hmmmmm](http://regex101.com/r/sI1oL7)? – HamZa

+0

爲什麼不連接所有文本在一行? – Pablo

回答

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() 
+0

這是我目前有 – Edmon

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) 

產生的元組的列表可以在需要時獲得與所需的子字符串的列表被縫合在一起垃圾文本已刪除。