我正在尝试在我的空闲时间创建一个解析器,它可以从有机化合物的名称中解析出所有的功能组。并排,我也试图制作一个显示程序,可以从文件中读取数据,在屏幕上绘制化合物的直观表示。两者都是在python中完成的。现在,显示器正在使用坐标系来存储原子的位置。这就是我制作解析器的原因。在你问之前,这不是一个学校项目。我是一名11年级学生,甚至没有接受过正则表达式的教学。
到目前为止,这是代码。抱歉没有评论。
import re
main_pattern = r"(.*)(meth|eth|prop|but|pent|hex|hept|oct|non|dec|isodec|dodec)-?([,?\d+,?]*)?-?(di|tri|tetra|penta)?(ane|ene|yne)(.*)"
prefix_patterns = [r"(?<!\d-\()(?<!-\()-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(methyl|ethyl|propyl|butyl|pentyl|hexyl|heptyl|octyl|nonyl|decyl)(?!\))",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(bromo|chloro|iodo|flouro)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(cyano)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(oxo|keto)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(alkoxy)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(hydroxy)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(formyl)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(carboxy)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(alkoxycabonyl)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(halocarbonyl)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(amino)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(carbamoyl)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(nitro)",
r"-?([,?\d+,?]*)?-(di|tri|tetra|penta)?(suplho)"]
branch_pattern = r"-?(\d+,?)*?-\((.*?)\)"
compound_name = r"1-methyl-2-pentyl-3,64,7-trihexyl-5-oxo-12,6,7-triketo-23-(siugvuis)-68-(asdlkhdrjnkln)-42-(3,4-dimethylpentyl)pent-5,2,7-triyne"
prefixes = list(prefix_patterns)
print compound_name
print '\n\n'
main=re.findall(main_pattern,compound_name)
print main
print '\n\n'
for x in prefix_patterns:
prefixes = re.findall(x,main[0][0])
print prefixes
branches = re.findall(branch_pattern,main[0][0])
print branches
在重新匹配“1-甲基”中前缀甲基的实例中,它也匹配甲基 -38-(3,4-二甲基戊基)。我抬头看着负向前瞻/后视。但无法取得令人满意的结果。
你能否指出问题所在,并指导我找到答案。 提前致谢
答案 0 :(得分:0)
恢复一个非常旧的,但这是我的看法。我编辑了 prefix_patterns
中的第一个元素:
r"(?<!\d-\()(?<!-\()-?(?<![\d,])([\d+,?]*)?-(di|tri|tetra|penta)?(methyl|ethyl|propyl|butyl|pentyl|hexyl|heptyl|octyl|nonyl|decyl)(?!\))"
我基本上只是在 (?<![\d,])
后面添加了否定的lookbehind,以避免在 -(3,4-dimethylpentyl)
的情况下与后面的数字匹配。这在您的示例中有效,但您可能想检查其他示例...(我不知道,因为我对有机化合物知之甚少)