python - pdf文件中的多行正则表达式
问题描述
我有兴趣从一些看起来像这样的 PDF 文件中提取一些信息。我只需要第 2 页的信息,之后看起来像这样:
- (U) 国家:[日期] [文本]。(括号内的文字)
这意味着它总是以一个国家的数字开始,并以括号结束,括号也可以转到下一行。
我在python中的实现如下:
- 使用 pdfminer extract_text 函数获取整个文本。
^\d{1,2}\. \(u\) \w+.\w*.\w*:.* on \d{1,2} \w+.*$
然后使用带有 re.MULTILINE 选项的这个正则表达式在整个文本中使用 re.findall 函数。
我注意到这会提取我感兴趣的所有段落的第一行,但我无法找到一种方法来抓取所有内容,直到段落结尾即括号 (.*)。
我想知道是否有人可以为此提供一些帮助。我希望我只能通过一个正则表达式来匹配它。否则我可能会尝试逐行拆分并遍历每一个。
提前致谢。
解决方案
您可以使用否定字符类匹配来更新模式,直到第一次出现,:
然后至少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))
推荐阅读
- c# - 在 Visual Studio 中调试异步 C#;按预期打破异常
- redhat - 在 vSphere 上的 RHEL 虚拟机上使用 Terraform 触发 virt-sysprep
- performance - 如何将最左边的表缓存在内存中以用于配置单元中的左外连接
- java - Spring Security 5 在 Application Runner 中调用 OAuth2 Secured API 导致 IllegalArgumentException
- java - 通过 Java 中的接口传递设置 - 可能吗?
- javascript - 在 javascript 中比较整数时遇到问题
- java - selenium 网格在同一浏览器上并行执行
- python - Python - 使用 scipy 加速余弦相似度
- google-cloud-platform - 你如何改变你的外部IP?
- r - fpc::dbscan 和 dbscan::dbscan 的结果不同