Python如何用单条正则提取PDF中跨多行的指定格式条目?
正则跨多行匹配PDF提取指定格式条目解决方案
你遇到的问题根源是原有正则用re.MULTILINE配合行尾匹配符$,只能捕获单行内容,要实现跨行匹配完整条目,仅需调整正则规则和匹配flag即可:
可用正则表达式
你需要同时开启re.DOTALL(让.可以匹配换行符)和re.IGNORECASE(兼容(U)大小写匹配),不要用行尾锚定,而是匹配到条目末尾的闭合括号为止,正则写法如下:
^\d{1,2}\. \(U\) [^:]+:.*?\(.*?\)(?=\s*(?:^\d{1,2}\. \(U\)|\Z))
匹配逻辑说明:
^\d{1,2}\. \(U\):严格匹配条目开头的「数字+点+空格+(U)+空格」规则[^:]+::匹配国家字段直到冒号位置,兼容包含特殊字符的国家名称.*?\(.*?\):非贪婪匹配所有中间内容,直到遇到括号并完整匹配整个括号内容(包括跨行的括号内文本)(?=\s*(?:^\d{1,2}\. \(U\)|\Z)):正向预查确认匹配结束位置,要么是下一个条目的开头,要么是全文末尾,避免匹配到其他无关内容
Python调用示例
直接调用re.findall传入对应flag即可,不需要拆分按行遍历:
import re # pdf_content为pdfminer提取的全文文本内容 result_list = re.findall(r'^\d{1,2}\. \(U\) [^:]+:.*?\(.*?\)(?=\s*(?:^\d{1,2}\. \(U\)|\Z))', pdf_content, flags=re.MULTILINE | re.DOTALL | re.IGNORECASE)
特殊场景适配
如果存在括号嵌套的情况,可以把括号匹配部分替换为\([^()]*(?:\([^()]*\)[^()]*)*\),即可支持最多2层嵌套括号的匹配。
内容的提问来源于stack exchange,提问作者conclv_damian
相关产品推荐
相关产品推荐

