我从具有三行或更多行感兴趣信息的文件中提取记录。信息是按顺序排列的,它遵循一个合理的模式,但它是可以的 中间有一些样板文本。
由于这是一个从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})
但我想提取感兴趣的整个数据。
这可能吗?如果可能,怎么样?
答案 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)
如果需要,可以将结果的元组列表拼接在一起,以获取删除了垃圾文本的所需子字符串列表。