首页 > 解决方案 > pdf文件中的多行正则表达式

问题描述

我有兴趣从一些看起来像这样的 PDF 文件中提取一些信息。我只需要第 2 页的信息,之后看起来像这样:

  1. (U) 国家:[日期] [文本]。(括号内的文字)

这意味着它总是以一个国家的数字开始,并以括号结束,括号也可以转到下一行。

我在python中的实现如下:

  1. 使用 pdfminer extract_text 函数获取整个文本。
  2. ^\d{1,2}\. \(u\) \w+.\w*.\w*:.* on \d{1,2} \w+.*$然后使用带有 re.MULTILINE 选项的这个正则表达式在整个文本中使用 re.findall 函数。

我注意到这会提取我感兴趣的所有段落的第一行,但我无法找到一种方法来抓取所有内容,直到段落结尾即括号 (.*)。

我想知道是否有人可以为此提供一些帮助。我希望我只能通过一个正则表达式来匹配它。否则我可能会尝试逐行拆分并遍历每一个。

提前致谢。

标签: pythonregexpdf

解决方案


您可以使用否定字符类匹配来更新模式,直到第一次出现,:然后至少on在它之后匹配。

要匹配所有以下行,您可以匹配换行符并断言下一行不只包含空格,后跟一个换行符,使用负前瞻。

使用不区分大小写的匹配:

^\d{1,2}\.\s\(u\)\s[^:\n]*:.*?\son\s\d{1,2}\s.*(?:\n(?![^\S\r\n]*\n).*)*

模式匹配:

  • ^字符串的开始
  • \d{1,2}\.\s\(u\)\s匹配 2 个数字、.一个空格字符和(u)
  • [^:\n]*:匹配除:或换行符以外的任何字符,然后匹配:
  • .*?\son\s匹配on空白字符之间的第一次出现
  • \d{1,2}\s匹配 1-2 位数字和一个空格字符
  • .*匹配该行的其余部分
  • (?:非捕获组
    • \n(?![^\S\r\n]*\n).*匹配换行符,并且不仅断言空格后跟换行符
  • )*关闭非捕获组并可选择重复

正则表达式演示

例如

pattern = r"^\d{1,2}\.\s\(u\)\s[^:]*:.*?\son\s\d{1,2}\s.*(?:\n(?![^\S\r\n]*\n).*)*"

print(re.findall(pattern, extracted_text, re.M | re.I))

推荐阅读