python中的Regex,它在多行上查看模式

2024-05-17 15:44:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

图案包括: 起始行:姓氏和名用逗号分隔,其他都不分隔
下一行将有两个长数字(>;=7位数字),后跟两个日期
最后一行是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

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

^{pr2}$

但也有可能遇到这样的情况:

^{3}$

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

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

到目前为止,我已经用以下三个规则来捕捉这些元素。表达式:

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

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

有可能吗?如果有,怎么可能?在


Tags: ortextname文本信息元素模式数字
2条回答

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

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)

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

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

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

相关问题 更多 >