Python正则表达式提取诊断信息失效,请求有效解决方案
解决方案:提取诊断条目
你的原始正则表达式没法正常工作主要有几个原因:没考虑到O RTHOSIS DEVICE里的空格、没处理多行内容、分组逻辑不对。下面给你两种可靠的实现方案,按需选择:
方案一:基于诊断块提取(更精准,适配复杂结构)
这种方法先定位每个DIAGNOSIS开头的块,再从块里提取所有诊断行,能处理像第一个块里多行诊断的情况:
import re txt = """DIAGNOSIS M19.072 Primary osteoarthritis, left ankle and foot 1 M19.072 Primary osteoarthritis, left ankle and foot 2 O RTHOSIS DEVICE(S) PRESCRIBED gfgfgfggfgfg 111111111112ffffffffff gfggggg DIAGNOSIS M17.12 Unilateral primary osteoarthritis, left knee O RTHOSIS DEVICE(S) PRESCRIBED gfgfgfggfgfg 11111ttttfffff gffffffffffffffffffffffffwwwwwwwwwree DIAGNOSIS M75.42 Impingement syndrome of left shoulder O RTHOSIS DEVICE(S) PRESCRIBED gfgfgfggfgfg 111111111112ffffffffff gfggggg wwwwwwwwww。""" # 提取每个DIAGNOSIS块,直到下一个DIAGNOSIS、O RTHOSIS DEVICE或文本结束 diagnosis_blocks = re.findall(r'DIAGNOSIS\s+(.*?)(?=\s*(DIAGNOSIS|O RTHOSIS DEVICE|$))', txt, re.DOTALL) diagnosis_Answer = [] for block, _ in diagnosis_blocks: # 拆分块为行,过滤空行并去除前后空白 lines = [line.strip() for line in block.split('\n') if line.strip()] diagnosis_Answer.extend(lines) print(diagnosis_Answer)
运行结果正好是你需要的四个诊断条目:
['M19.072 Primary osteoarthritis, left ankle and foot 1', 'M19.072 Primary osteoarthritis, left ankle and foot 2', 'M17.12 Unilateral primary osteoarthritis, left knee', 'M75.42 Impingement syndrome of left shoulder']
方案二:直接匹配诊断行(更简洁,适用于格式固定的场景)
如果你的诊断行都是以M+数字+.+数字的代码开头,可以直接用多行匹配提取,代码更短:
import re txt = """DIAGNOSIS M19.072 Primary osteoarthritis, left ankle and foot 1 M19.072 Primary osteoarthritis, left ankle and foot 2 O RTHOSIS DEVICE(S) PRESCRIBED gfgfgfggfgfg 111111111112ffffffffff gfggggg DIAGNOSIS M17.12 Unilateral primary osteoarthritis, left knee O RTHOSIS DEVICE(S) PRESCRIBED gfgfgfggfgfg 11111ttttfffff gffffffffffffffffffffffffwwwwwwwwwree DIAGNOSIS M75.42 Impingement syndrome of left shoulder O RTHOSIS DEVICE(S) PRESCRIBED gfgfgfggfgfg 111111111112ffffffffff gfggggg wwwwwwwwww。""" # 匹配所有以M开头的诊断代码行,re.MULTILINE让^匹配每行开头 diagnosis_Answer = re.findall(r'^M\d+\.\d+\s.+$', txt, re.MULTILINE) print(diagnosis_Answer)
这个方案的前提是文本里没有其他以M\d+\.\d+开头的非诊断行,否则会误匹配。
为什么你的原始正则失效?
- 未处理空格:你要匹配的结束标记是
O RTHOSIS DEVICE,但你的正则里写的是RTHOSIS DEVICE,漏掉了O和R之间的空格,导致无法定位结束位置。 - 未处理多行:没有加
re.DOTALL标志,.*?不会匹配换行符,只能捕获同一行的内容,没法提取第一个块里的第二行诊断。 - 分组逻辑错误:你的正则分组方式会捕获整个
DIAGNOSIS...RTHOSIS DEVICE的大段内容,而不是单独的诊断条目,后续也没法直接提取需要的内容。
内容的提问来源于stack exchange,提问作者Ayoub Rasta
相关产品推荐
相关产品推荐

