创建用于解析IUPAC有机化合物名称的正则表达式

时间:2014-03-08 09:22:18

标签: python regex

我正在尝试在我的空闲时间创建一个解析器,它可以从有机化合物的名称中解析出所有的功能组。并排,我也试图制作一个显示程序,可以从文件中读取数据,在屏幕上绘制化合物的直观表示。两者都是在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-二甲基戊基)。我抬头看着负向前瞻/后视。但无法取得令人满意的结果。

你能否指出问题所在,并指导我找到答案。 提前致谢

1 个答案:

答案 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) 的情况下与后面的数字匹配。这在您的示例中有效,但您可能想检查其他示例...(我不知道,因为我对有机化合物知之甚少)