You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:38:41