如何保留主词内符号并移除蛋白质名称末尾的括号与方括号?
保留蛋白质名称内部括号,移除末尾括号及内容的正确实现
需要处理蛋白质名称字符串,要求:
- 移除行末尾的圆括号
()、方括号[]及其中的所有内容 - 保留主名称内的括号符号(例如
H(+)/Cl(-) exchange transporter 6中的括号需完整保留)
原始数据集
data = { "Entry": ["A0A087X1C5", "A0A0B4J2F0", "O00468", "P51797", "O75164"], "Reviewed": ["reviewed"] * 5, "Entry Name": ["CP2D7_HUMAN", "PIOS1_HUMAN", "AGRIN_HUMAN", "CLCN6_HUMAN", "KDM4A_HUMAN"], "Protein names": [ "Putative cytochrome P450 2D7 (EC 1.14.14.1)", "Protein PIGBOS1 (PIGB opposite strand protein 1)", "Agrin [Cleaved into: Agrin N-terminal 110 kDa subunit; Agrin C-terminal 110 kDa subunit; Agrin C-terminal 90 kDa fragment (C90); Agrin C-terminal 22 kDa fragment (C22)]", "H(+)/Cl(-) exchange transporter 6 (Chloride channel protein 6) (ClC-6) (Chloride transport protein 6)", "Lysine-specific demethylase 4A (EC 1.14.11.66) (EC 1.14.11.69) (JmjC domain-containing histone demethylation protein 3A) (Jumonji domain-containing protein 2A) ([histone H3]-trimethyl-L-lysine(36) demethylase 4A) ([histone H3]-trimethyl-L-lysine(9) demethylase 4A)" ], "Gene Names": ["CYP2D7", "PIGBOS1", "AGRN AGRIN", "CLCN6 KIAA0046", "KDM4A JHDM3A JMJD2 JMJD2A KIAA0677"], "Length": [515, 54, 2068, 869, 1064], "STRING": [None, "9606.ENSP00000484893", "9606.ENSP00000368678", "9606.ENSP00000234488", "9606.ENSP00000361473"] } # Load into DataFrame df = pd.DataFrame(data)
预期处理结果
result = { "Entry": ["A0A087X1C5", "A0A0B4J2F0", "O00468", "P51797", "O75164"], "Reviewed": ["reviewed"] * 5, "Entry Name": ["CP2D7_HUMAN", "PIOS1_HUMAN", "AGRIN_HUMAN", "CLCN6_HUMAN", "KDM4A_HUMAN"], "Protein names": [ "Putative cytochrome P450 2D7", "Protein PIGBOS1", "Agrin", "H(+)/Cl(-) exchange transporter 6", "Lysine-specific demethylase 4A" ], "Gene Names": ["CYP2D7", "PIGBOS1", "AGRN AGRIN", "CLCN6 KIAA0046", "KDM4A JHDM3A JMJD2 JMJD2A KIAA0677"], "Length": [515, 54, 2068, 869, 1064], "STRING": [None, "9606.ENSP00000484893", "9606.ENSP00000368678", "9606.ENSP00000234488", "9606.ENSP00000361473"] } # Expected result result_df = pd.DataFrame(result)
现有尝试的问题
- 方法一(正则替换):误匹配主词内的括号,导致内容截断
df['Protein names'] = df["Protein names"].str.replace(r'\s*(\(|\[).*?(\)|\])\s*$', '', regex=True).str.strip() # 错误结果:H(+)/Cl(-)... 变为 H - 方法二(字符串拆分):误将主词内带括号的部分拆分出去,丢失有效内容
df["Protein names"] = df["Protein names"].str.split(' \(').str[0].str.strip() df["Protein names"] = df["Protein names"].str.split(' \[').str[0].str.strip() # 错误结果:Very-long-chain (3R)-... 变为 Very-long-chain
正确解决方案
核心思路:只匹配前面带有空格的末尾括号(圆括号/方括号)及后续所有内容——主词内的括号前无空格,不会被误匹配。
使用如下代码实现:
df['Protein names'] = df["Protein names"].str.replace(r'\s+(\(|\[).*$', '', regex=True).str.strip()
正则规则说明
\s+:匹配一个或多个空格,确保只匹配前面带空格的括号(\(|\[):匹配开头的圆括号或方括号.*$:匹配括号后的所有内容直到字符串结尾str.strip():去除替换后可能残留的首尾空格
测试验证:
- 对于
H(+)/Cl(-) exchange transporter 6 (Chloride channel...),处理后得到H(+)/Cl(-) exchange transporter 6 - 对于
Very-long-chain (3R)-3-hydroxyacyl-CoA dehydratase 1 (EC...),处理后得到Very-long-chain (3R)-3-hydroxyacyl-CoA dehydratase 1
内容的提问来源于stack exchange,提问作者Ssong
相关产品推荐
相关产品推荐

