Python正则提取字符串目标子串结果不符预期的解决方法
问题根因
- 原正则
^(.*) \(.* \[HSA使用贪婪匹配规则,会一次性匹配整行大段内容,无法精准拆分单个基因条目 - 二次替换逻辑直接将所有括号、方括号匹配段统一替换为
|,没有过滤空匹配、前后冗余空白,导致出现连续多余分隔符 - 未兼容两种基因名格式:基因名在前带事件注释的格式(如
BCR-ABL (translocation))、带括号别名在前正式名在后的格式(如(GALAC1) GALT)
修正方案
放弃“整行匹配+二次替换”的思路,直接编写精准匹配单个基因名的正则,逐行提取所有有效基因名后统一拼接分隔符,从根源避免多余分隔符问题。
修正后的可运行代码:
import re # 正则规则说明: # 匹配基因间的多空格分隔/行首,兼容前缀括号别名、后缀括号注释,捕获[HSA]标记前的正式基因名 gene_extract_pattern = re.compile(r'(?:^|\s{2,})(?:\([^)]*\)\s*)?([A-Za-z0-9-]+)\s*(?:\([^)]*\))?\s*\[HSA:') # 逐行处理基因列数据 for line_num, line_content in enumerate(dict['GENE'].split('\n'), 1): stripped_line = line_content.strip() # 跳过表头、空行 if not stripped_line or stripped_line == 'gene': continue # 提取当前行所有基因名,按要求拼接 matched_genes = gene_extract_pattern.findall(line_content) print(f"{line_num} {' | '.join(matched_genes)}")
运行结果
执行代码后将输出完全符合预期的结果:
1 BCR-ABL | MLL-AF4 | E2A-PBX1 | TEL-AML1 | c-MYC | CRLF2 | PAX5 2 GALT | GALK1 | GALE | GALM
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

