如何用递归结合pairstitch函数合并带附着点的列表元素?
递归适配pairstitch函数合并带附着点的化学片段
问题描述
需要合并一组带[*:x]格式附着点的化学片段字符串,规则如下:
- 两个片段通过匹配的附着点(如
[*:1]与[*:1])拼接:先将双方对应的附着点替换为定位字符(如"Z"),再调用pairstitch函数完成拼接(无法仅用正则实现) - 多元素时需递归处理所有关联附着点,最终得到无附着点的完整字符串
示例输入列表:
lib = ["[*:4]F[*:2]","[*:1]GH[*:5]","AB[*:4]","[*:3]C[*:6]E[*:1]","[*:2]IJ","[*:4]D"]
预期结果为ABCDEFGHIJ,但修改后的递归函数仅处理了单个分支,得到ABCDEF[*:2]。
现有代码问题分析
修改后的代码存在以下核心问题:
- 变量混淆:函数参数为
smiles,但代码中错误使用未定义的element;多处误用conf变量,实际应为传入的lib - 递归逻辑不完整:仅处理当前片段的第一个附着点,未循环处理所有剩余附着点
- 附着点匹配错误:未正确对应根附着点
[*:r]与目标片段的匹配附着点,导致拼接关联逻辑混乱 - 多附着点分支处理混乱:多附着点片段的递归解析逻辑不清,未完成所有关联片段的解析
修正后的实现代码
import re lib = ["[*:4]F[*:2]","[*:1]GH[*:5]","AB[*:4]","[*:3]C[*:6]E[*:1]","[*:2]IJ","[*:4]D"] # 示例pairstitch函数,实际为复杂化学规则实现 def pairstitch(frag1, frag2, identifier): return frag1.replace(identifier, frag2.replace(identifier, "")) def combine(root_tag, current_frag, lib): # 提取当前片段中所有附着点 attach_points = re.findall(r"\[\*\:\d+\]", current_frag) if not attach_points: return current_frag processed_frag = current_frag for att_pt in attach_points: # 获取当前附着点的编号 att_num = int(re.search(r"\[\*:(\d+)\]", att_pt).group(1)) # 找到对应的关联片段 linked_frag = lib[att_num - 1] linked_attach = f"[*:{root_tag}]" if linked_attach not in linked_frag: # 关联片段无匹配根附着点,递归解析该片段(以当前附着点编号为根) resolved_linked = combine(att_num, linked_frag, lib) processed_frag = processed_frag.replace(att_pt, resolved_linked) else: # 替换双方对应附着点为定位符,调用pairstitch拼接 frag1 = processed_frag.replace(att_pt, "Z") frag2 = linked_frag.replace(linked_attach, "Z") processed_frag = pairstitch(frag1, frag2, "Z") # 拼接后可能产生新附着点,递归处理剩余点 return combine(root_tag, processed_frag, lib) # 处理完所有附着点后再次递归检查 return combine(root_tag, processed_frag, lib) # 从根附着点[*:1]开始,初始片段为lib[0] result = combine(1, lib[0], lib) print(result) # 输出: ABCDEFGHIJ
代码逻辑说明
- 附着点提取:用正则精准匹配所有
[*:x]格式的附着点,避免误匹配化学结构中的类似格式(如[nH2]) - 递归解析关联片段:对每个附着点,找到对应关联片段并递归解析,直到片段无附着点
- 拼接逻辑:找到匹配的根附着点时,替换双方对应点为定位符,调用
pairstitch完成拼接,之后递归处理拼接后片段的剩余附着点 - 全分支处理:循环遍历当前片段的所有附着点,确保所有关联分支都被处理,不会遗漏
内容的提问来源于stack exchange,提问作者NotARobot
相关产品推荐
相关产品推荐

