如何用Python移除PyPDF2提取文本中的条码非ASCII字符串?
解决PyPDF2转换后条码乱码的文本清理方案
看起来你被PyPDF2把条码转成的无意义乱码坑惨了——这些连续的1/I/l混排、奇怪符号确实会搞砸后续的文本提取。之前你尝试的正则太针对特定串,unidecode也没法处理这种完全无意义的字符堆,我给你一套通用的清理方案,能有效剥离这些乱码,保留有用的医疗报告内容:
核心思路
条码转成的乱码有几个明显特征:
- 大量连续重复的数字/字母(比如成串的
1、I、l) - 非打印ASCII字符或奇怪的符号组合
- 无意义的字符序列(和医疗报告的结构化内容完全不搭)
我们可以通过分层过滤来清理:先移除非打印字符,再干掉重复的无意义字符,最后保留正常的文本符号。
具体实现代码
import re from nltk.tokenize import sent_tokenize # 分句用,按需保留 def clean_barcode_garbage(text): # 1. 移除非打印ASCII控制字符 text = re.sub(r'[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]', '', text) # 2. 移除连续5次以上的1/I/l(条码转码的典型乱码) text = re.sub(r'([1Il])\1{5,}', '', text) # 3. 保留常用字符,过滤奇怪的乱码符号 # 只留字母、数字、空格、逗号、句号、冒号、分号、括号、破折号 text = re.sub(r'[^a-zA-Z0-9\s.,:;()\-]+', '', text) # 4. 可选:移除UUID前缀的乱码(不需要UUID的话启用) text = re.sub(r'-aUUID:[0-9A-Fa-f\-]+', '', text) # 5. 清理多余空格,让文本更规整 text = re.sub(r'\s+', ' ', text).strip() return text # 读取示例文本文件 with open('acc-53.txt', 'r', encoding='utf-8') as f: raw_text = f.read() # 执行清理 cleaned_text = clean_barcode_garbage(raw_text) # 调整后的信息提取函数(用清理后的完整文本,而非分句列表) def findInfo(text): uuId = re.findall(r'\w{8}\-\w{4}\-\w{4}\-\w{4}\-\w{12}', text) Gender = re.findall(r'female|Female|male|Male', text) # 优化肿瘤尺寸匹配,支持带小数、cm/mm单位的格式 tSize = re.findall(r'\d+(\.\d+)?\s*x\s*\d+(\.\d+)?\s*x\s*\d+(\.\d+)?\s*(cm|mm)', text, re.IGNORECASE) # 匹配Diagnosis字段内容,直到换行/逗号/结尾 Diag = re.findall(r'(DIAGNOSIS|Diagnosis):\s*(.*?)(?:,|\n|$)', text, re.IGNORECASE) # 匹配左右侧别 side = re.findall(r'(LEFT|Right|left|right)\s*(?:Side)?', text, re.IGNORECASE) return uuId, Gender, tSize, Diag, side # 提取并打印结果 uuId, Gender, tSize, Diag, side = findInfo(cleaned_text) print("UUID:", uuId) print("Gender:", Gender) print("Tumor Size:", tSize) print("Diagnosis:", Diag) print("Side:", side)
为什么之前的方法没生效?
- 你写的正则都是针对特定乱码串(比如
\III IIIIIIIIIIIIIIIII...),换个条码生成的乱码就完全不匹配,通用性极差; unidecode只是把非ASCII字符转成近似ASCII,但条码乱码本身是无意义的字符堆,转完还是没法用;decode('unicode_escape').encode('latin')这种编码转换会破坏正常字符,反而添乱;- 你的
findInfo函数用了分句后的列表sentences,但re.findall不能直接处理列表,应该用清理后的完整文本。
测试效果
用你提供的acc-53.txt示例文本,清理后会保留所有有用的医疗报告内容,完全可以正常进行后续的信息提取。
内容的提问来源于stack exchange,提问作者krishna lad
相关产品推荐
相关产品推荐

