使用正则表达式获取化学元素列表

问题描述 投票:0回答:1

我有这个正则表达式:

[A-Z][a-z]?\d*|\((?:[^()]*(?:\(.*\))?[^()]*)+\)\d+

此正则表达式返回所有简单和嵌套的化学公式,例如:

O2
SO4
Al2(SO4)3

我想得到这些化学公式并用它们编写一个程序来平衡化学方程式。 现在我想改进这个正则表达式,以便它可以分离元素和数量并将它们放入列表或元组中,例如:

O2 -> ('O', 2)
SO4 -> (('S', 1), ('O', 4))
Al2(SO4)3 -> ((('Al', 2), ((('S', 1), ('O', 4)),3)), 1)

这有助于我将相同数量的第二个值乘以第一个值并简化方程,以便我可以求解它。但如果可能的话,我不知道如何使用正则表达式来做到这一点。 如果不可能,请告诉我使用 python 的解决方案,或者告诉我您是否有更好的方法来简化这些方程或求解它们。 我想尽可能避免使用图书馆。

python regex chemistry
1个回答
0
投票

使用正则表达式是不可能的。

试试这个:


def parse_formula(formula):
    elements = re.findall(r'([A-Z][a-z]*)(\d*)', formula)
    parsed_formula = []
    for element, quantity in elements:
        if quantity == '':
            quantity = 1
        else:
            quantity = int(quantity)
        parsed_formula.append((element, quantity))
    return tuple(parsed_formula)

def parse_nested_formula(formula):
    nested_formula = re.findall(r'([A-Z][a-z]*\d*|\([^()]*\)\d*)', formula)
    parsed_nested_formula = []
    for item in nested_formula:
        if item.startswith('('):
            element, quantity = re.match(r'\(([^()]*)\)(\d*)', item).groups()
            parsed_nested_formula.append((parse_nested_formula(element), int(quantity)))
        else:
            parsed_nested_formula.append(parse_formula(item))
    return tuple(parsed_nested_formula)

def simplify_equation(formula):
    parsed_formula = parse_nested_formula(formula)
    simplified_formula = []
    for element, quantity in parsed_formula:
        if isinstance(element, tuple):
            element = simplify_equation(element)
        simplified_formula.append((element, quantity))
    return tuple(simplified_formula)

formula = "Al2(SO4)3"
simplified = simplify_equation(formula)
print(simplified)

此代码分析给定的化学式,将其分解为各个组成部分,并将它们作为元组返回。然后,它通过组合这些组件并在必要时乘以数量来简化方程。这是一个基本的解决方案;你可以让它变得更复杂来处理更复杂的方程。

© www.soinside.com 2019 - 2024. All rights reserved.