如何提取Diagnosis:或diagnosis:后的3个及以上单词?
提取诊断信息中3个及以上单词的解决方案
问题分析
你之前的正则表达式只能匹配单个单词,核心问题在于:
- 限定仅匹配
\w+(单个单词),未处理多单词场景 - 用
.结尾可能提前截断匹配内容 - 重复定义大小写模式,冗余且不够简洁
正则表达式修改
使用以下正则可以匹配diagnosis:(不区分大小写)后3个及以上单词:
r'diagnosis:\s+((?:\w+\s+){2,}\w+)'
diagnosis::匹配关键词(后续通过re.IGNORECASE忽略大小写)\s+:匹配冒号后的任意数量空格(?:\w+\s+){2,}:非捕获组,匹配至少2个"单词+空格"的组合\w+:匹配最后一个单词,确保总单词数≥3
完整修改后的代码
import re #@title Extract Diagnosis { form-width: "20%" } def extract_Diagnosis(clinical_information): # 单个正则+忽略大小写,覆盖Diagnosis/diagnosis两种情况 pattern = r'diagnosis:\s+((?:\w+\s+){2,}\w+)' matches = re.findall(pattern, clinical_information, flags=re.IGNORECASE) # 处理匹配结果:去重、去空格、过滤空值 valid_diagnoses = [match.strip() for match in matches if match.strip()] # 返回第一个有效结果,或者空字符串(可按需调整为返回所有匹配) return valid_diagnoses[0] if valid_diagnoses else "" # 遍历文本列表提取诊断 for index, text in enumerate(texts): diagnosis = extract_Diagnosis(text) print(diagnosis) print("#"*79, index)
代码调整说明
- 简化正则模式:用
re.IGNORECASE标志统一处理大小写,无需定义两个重复模式 - 修复缩进错误:原代码存在缩进混乱问题,已修正为符合Python规范的缩进
- 结果处理优化:对匹配结果做去空格、过滤空值处理,确保返回有效内容
- 灵活返回逻辑:如果有多个匹配,返回第一个有效诊断;无匹配则返回空字符串(可根据需求调整为返回所有匹配)
额外优化建议
如果诊断文本中包含连字符(如non-small cell lung cancer)或标点(如type 2 diabetes, uncontrolled),可以把正则中的\w+替换为[\w-]+,同时允许匹配结尾的标点:
r'diagnosis:\s+((?:[\w-]+\s+){2,}[\w-]+)(?:[.,;]|$)'
这样可以兼容更多临床文本格式。
内容的提问来源于stack exchange,提问作者Mahshid Nik Ravesh
相关产品推荐
相关产品推荐

