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

这是文本输出:

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集,因此性能将受到关注。

尝试使用正则表达式:

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函数来查找它的位置。position = raw_text.find('ID No. : ')应返回ID号中I的位置。位置+9应为ID的第一位。当号码长度始终为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)

最新更新