[英]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.