【问题标题】:Parse unstructured text in python在python中解析非结构化文本
【发布时间】:2020-08-20 13:20:53
【问题描述】:

我是 python 新手,我正在尝试阅读 PDF 文件以提取 ID No.。到目前为止,我已经成功地使用pdfplumber 从 PDF 文件中提取了文本。下面是代码块:

import pdfplumber

with pdfplumber.open('ABC.pdf') as pdf_file:
    firstpage = pdf_file.pages[0]
    raw_text = firstpage.extract_text()
    print (raw_text)

这是文本输出:

Welcome to ABC
01 January, 1991
ID No. : 10101010
Welcome to your ABC portal. Learn
More text here..
Even more text here..
Mr Jane Doe
Jack & Jill Street Learn more about your
www.abc.com
....
....
....

但是,我无法找到进一步解析此非结构化文本的最佳方法。我期望的最终输出只是 ID 号,即10101010。附带说明一下,该脚本将用于处理相当大量的 PDF,因此性能值得关注。

【问题讨论】:

  • 这个查询只是一个滚动到一个程序的函数,它应该分割巨大的 PDF 文件,我发现这些文件可以很好地与 python 配合使用,因此是首选。顺便说一句,你在想什么?
  • @LarsSkaug:定义“慢”。评论相当笼统和自以为是。
  • @NobleAbraham:正如我在下面的回答中所提到的,Scala 可能值得你看看。 Python 很棒,但不是万能的。如果你还是要开始,为什么不看看 Scala?

标签: python parsing pdf text


【解决方案1】:

尝试使用正则表达式:

import pdfplumber
import re

with pdfplumber.open('ABC.pdf') as pdf_file:
    firstpage = pdf_file.pages[0]
    raw_text = firstpage.extract_text()
    m = re.search(r'ID No\. : (\d+)', raw_text)
    if m:
        print(m.group(1))

当然,您必须遍历所有 PDF 的内容——不仅仅是第一页!还要问问自己,每页是否有可能不止一个匹配项。无论如何:你比我更了解输入的结构(而且我们无权访问示例文件),所以我将把它留给你作为练习。

【讨论】:

  • 这里缺少某些东西,结果为空。不,页面上不会有多个匹配项。
  • 也许^ID No\.(即锚点)可以加快速度。 +1。
  • 啊,切换到搜索而不是匹配后就像一个魅力。谢谢!
【解决方案2】:

如果 id 号的长度始终相同,我会尝试使用 find-function 找到它的位置。 position = raw_text.find('ID No. : ')应该返回我在ID号位置的位置+9应该是id的第一个数字。当数字的长度始终为 8 时,您可以通过 int(raw_text[position+9:position+17]) 获得它

【讨论】:

    【解决方案3】:

    如果您是 Python 新手,并且确实需要处理大量数据,我建议您将 Scala 作为替代方案。

    对于一般的数据处理,尤其是正则表达式匹配,获得结果所需的时间大大减少。

    这是您在 Scala 而不是 Python 中的问题的答案:

    import com.itextpdf.text.pdf.PdfReader
    import com.itextpdf.text.pdf.parser.PdfTextExtractor
    
    val fil = "ABC.pdf"
    
    val textFromPage = (1 until (new PdfReader(fil)).getNumberOfPages).par.map(page => PdfTextExtractor.getTextFromPage(new PdfReader(fil), page)).mkString
    
    val r = "ID No\\. : (\\d+)".r
    
    val res = for (m <- r.findAllMatchIn(textFromPage )) yield m.group(0)
    
    res.foreach(println)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2023-03-16
      相关资源
      最近更新 更多