如何移除通过Regex从PDF提取的指定目标字符串?
如何移除PDF提取文本中的特定冗余字符串?
嘿,我来帮你搞定这个PDF文本清理的问题!从你列出的几个要移除的字符串来看,都是PDF提取时带出来的包含Page标记、发票相关前缀的冗余块,下面是具体的解决思路和代码示例:
第一步:先梳理冗余内容的共性模式
你要清理的文本块有几个明显特征:
- 包含
Page关键字(后面可能跟着数字,也可能是空的) - 常和
Invoice No./INVOICE :/Invoice Date:这类发票相关前缀绑定出现 - 都是多行的文本片段
第二步:编写针对性的正则表达式
我们可以写一个正则来精准匹配这些多行冗余块,搭配re.DOTALL(让.能匹配换行符)和re.IGNORECASE(忽略大小写差异,避免大小写不一致漏匹配)两个标志:
import re # 定义匹配冗余块的正则模式 cleanup_pattern = r'(?:Invoice No\.|INVOICE :|Invoice Date:)?\s*(?:Page\s*\d?\s*\n?)+.*?(?:\n|$)'
正则模式拆解:
(?:Invoice No\.|INVOICE :|Invoice Date:)?:匹配可选的发票类前缀,?:表示这是个非捕获组(不单独提取内容),?表示这个前缀是可选的\s*:匹配任意数量的空白字符(包括空格、换行)(?:Page\s*\d?\s*\n?)+:匹配一个或多个Page相关行,\d?允许Page后面跟着可选的数字(比如Page 1或Page),\n?允许行尾带可选的换行.*?(?:\n|$):非贪婪匹配后续的所有内容,直到遇到下一个换行或文本结尾,避免误匹配到有效内容
第三步:用正则替换完成清理
假设你从PDF提取的原始文本存在extracted_text变量里,直接用re.sub替换掉匹配到的冗余内容即可:
# 示例:原始提取的文本 extracted_text = """ Invoice No. Page 1 WS350430 DRDR30899 这是需要保留的有效内容 INVOICE : Invoice Date: Page SI01240784 更多有效内容 Page 1 WS350430 Invoice Date: Page """ # 执行清理 cleaned_text = re.sub(cleanup_pattern, '', extracted_text, flags=re.DOTALL | re.IGNORECASE) print(cleaned_text)
运行后,所有你列出的冗余块都会被移除,只剩下有效内容。
灵活调整的小技巧
如果遇到特殊情况没覆盖到,你可以随时调整正则:
- 如果有其他发票前缀(比如
Invoice #),直接加到第一个非捕获组里,比如(?:Invoice No\.|INVOICE :|Invoice Date:|Invoice #)? - 如果
Page后面的内容有固定格式,也可以细化匹配规则(比如只匹配带数字的Page \d+)
内容的提问来源于stack exchange,提问作者reddy
相关产品推荐
相关产品推荐

