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

如何保留主词内符号并移除蛋白质名称末尾的括号与方括号?

保留蛋白质名称内部括号,移除末尾括号及内容的正确实现

需要处理蛋白质名称字符串,要求:

  • 移除行末尾的圆括号()、方括号[]及其中的所有内容
  • 保留主名称内的括号符号(例如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:58:10