繁体   English   中英

解析 python 中的非结构化文本

[英]Parse unstructured text in python

我是 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)

这是文本 output:

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
....
....
....

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

尝试使用正则表达式:

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 号的长度始终相同,我会尝试使用 find-function 找到它的位置。 position = raw_text.find('ID No. : ')应该返回 ID 号中 I 的 position。 position + 9 应该是第一个数字。 当数字的长度始终为 8 时,您可以使用int(raw_text[position+9:position+17] )

如果您是 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM