【问题标题】:Multiline regex in pdf filepdf文件中的多行正则表达式
【发布时间】:2021-11-06 00:13:10
【问题描述】:

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

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

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

我在python中的实现如下:

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

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

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

提前致谢。

【问题讨论】:

    标签: python regex pdf


    【解决方案1】:

    您可以使用否定字符类匹配来更新模式,直到第一次出现 :,然后至少匹配 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).* 匹配换行符,并且不仅断言空格后跟换行符
    • )* 关闭非捕获组并可选择重复

    Regex demo

    例如

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

    【讨论】:

    • 是的,成功了!非常感谢。如果您知道如何使用 REGEX 进行操作,您似乎可以做任何事情。顺便说一句,令人惊叹的解释和正则表达式演示看起来非常好。我将深入阅读它,看看我是否完全理解您对这种模式的看法。
    • 顺便说一句,你知道为什么它不能像其他例子一样完全捕捉到下面的例子吗?它们看起来与按预期捕获的那些没有任何不同。一个是 2。(u) 秘鲁:9 月 9 日,一名值班船员在一艘停泊在附近位置的集装箱船上进行例行巡查,另一个是 1。(u) 巴布亚新几内亚:9 月 7 日,两名海盗嫌疑人被捕地方当局在它看起来像是被剪掉了,直到括号才被抓住。
    • @conclv_damian 当我在 regex101 演示中检查它时,它似乎工作。见regex101.com/r/B2DSLX/1
    • 是的,在最新的正则表达式演示链接中,您已经在开头手动放置它并且它抓住了它。虽然,例如在这两个链接中,它并没有像在文本中那样捕获它。例如,如果您转到“巴布亚新几内亚:..”中的文本末尾,您会看到它没有被捕获。
    • @conclv_damian 你可能会考虑到最后的括号regex101.com/r/3M9Zhp/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2012-03-12
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多