【问题标题】:Extracting Information from a List of Documents从文档列表中提取信息
【发布时间】:2022-01-13 14:32:22
【问题描述】:

我从文件夹中提取了大量 .txt 文档(使用 glob)。然后我通过这样做将每个文档附加到一个名为 MaxDoc 的列表中:

Documents1 = glob.glob('path*.txt')

MaxDoc = []

for file in Documents1:
     f = open(file,'r')
     MaxDoc.append(f.readlines())
     f.close()

现在,我想做的是:该列表中的每个项目都是一个完整的文档。每个文档都有一个部分显示“上次修订日期:mm/dd/yyyy”和“修订号:xx”

这里是包含信息的文档部分的快照:

我一直在尝试查看是否可以遍历列表并使用正则表达式来查找字符串并提取信息。一旦我提取它,我需要将它保存为一个变量,因为我需要删除这个文档的所有顶部(文档的后面部分是一个表格,我想将它转换为一个 df)。 TIA 有什么建议!

编辑:

我已使用此正则表达式模式仅对以下文本文档之一进行测试:

handle = open('path','r').read()

Date_of_Last_Rev = re.findall(r'Date\sOf\sLast\sRevision:\s(\d\d\/\d\d\/\d\d\d\d)',handle)

Revision_No: = re.findall(r'Revision\sNo.:(\s\d\d)', handle, re.S)

output: Date_of_Last_Rev: ['12/27/2021'] 
output: Revision_No: ['18']

所以正则表达式模式有效并且能够识别正确的信息。但是,我仍然无法让它遍历 MaxDoc 列表中的每个文档。

我试过这个:

for item in MaxDoc:
     Date_of_Last_Rev = 
     re.findall(r'Date\sOf\sLast\sRevision:\s(\d\d\/\d\d\/\d\d\d\d)',MaxDoc)

     Revision_No: = re.findall(r'Revision\sNo.:(\s\d\d)', MaxDoc, re.S)

还有这个:

for line, item in MaxDoc:
     Date_of_Last_Rev = 
     re.findall(r'Date\sOf\sLast\sRevision:\s(\d\d\/\d\d\/\d\d\d\d)',MaxDoc)

     Revision_No: = re.findall(r'Revision\sNo.:(\s\d\d)', MaxDoc, re.S)

我得到一个错误:'expected string or bytes-like object'(第一个示例)或空列表(第二个示例)

根据要求,以下是文本示例:

“根据 | 美国劳工部的工资确定登记册
服务合同法 |用工标准管理
由劳工部长指示|工资和工时划分
|华盛顿特区 20210
| | | |工资确定编号:2015-4001 Daniel W. Simms 分部 |修订号:18 董事工资确定|最后修订日期:2021 年 12 月 27 日 | >_____ 注意:受《服务合同法》约束的合同通常需要 至少支付行政命令要求的适用最低工资率 14026 或行政命令 13658。

【问题讨论】:

  • 如果你一直在尝试,什么没有奏效?
  • @3DspatialUser,我定义了一个函数 RevDate(s),并做了“return [i for i in f if re.search(r''Date\sof\sLast\sRevision:\s(\ d\d\\\d\d\\\d\d\d\d)', i)]"。然后在 MaxDoc 上调用函数“Last_Rev_Date = RevDate(MaxDoc)。这创建了一个列表变量 Last_Rev_Date,但它是空的

标签: python list date


【解决方案1】:

你可以只寻找关键词,然后只提取内容:

import re

txt = '''
This is a part text
With multi line

It could be a text 
document.
Revision No.: 18
Date: 12/27/2021

Other text

table,table,table
table,table,table
'''

results = re.findall(r'Revision No\.:\s*(\d+).*Date:\s*([\d\/]+)', txt, re.S)

for i in results:
    print('Revision:', i[0])
    print('Date:', i[1])

【讨论】:

  • 这给了我一个名为“结果”的列表,它是空的:(。我似乎无法在文档中找到正则表达式
  • 您尝试了我的代码还是在文档中使用了我的正则表达式?如果是后者,请给出一个文档示例供我自己尝试。假设所有内容的格式不会导致快速结果......
【解决方案2】:

如果列表中的每一项都是整个文档(我假设是一个字符串),那么您可以将正则表达式与多字符串一起使用。

我没有您的文字(问题中没有给出),但我会向您展示一个带有其他文字的示例,您可以将其用作您自己的代码的开始。

import re

txt='''
This is a part text
With multi line

It could be a text 
document.
Revision No.: 18
Date: 12/27/2021

Other text

table,table,table
table,talbe,table
'''

reg_revision_no = re.compile(r'(Revision\sNo.:\s+\d+)')
reg_date = re.compile(r'(Date:\s+\d2\/\d{2}\/\d{4})')

files = [txt, txt]
for file in files:
    revision_no = reg_revision_no.search(file, re.M).group()
    date = reg_date.search(file, re.M).group()
    print(f"Revision No.: {revision_no}\nData: {date}")

输出:

Revision No.: Revision No.: 18
Data: Date: 12/27/2021
Revision No.: Revision No.: 18
Data: Date: 12/27/2021

【讨论】:

  • 谢谢,这是我试图进入的方向。但是,我收到“NoneType”对象没有属性“组”错误。这是因为它在搜索?如果是这样,也许我需要找出正确的正则表达式。
  • 是的,这意味着正则表达式为空。你没有展示你的数据是什么样子的,所以我不能用你的例子来测试它,但我希望这个例子对你有用,你可以从那里走得更远。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
相关资源
最近更新 更多