1

上一个问题中,有人建议,为了分割字符串并存储它,我应该使用一个列表,如下所示:

[a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]
['Mg', u'S', u'O', u'4']

这次我想问的是如何使用它来将创建的不同字符串存储到变量中,以便我可以在我拥有的 CSV 文件中查找它们,如果可能的话。它说“MgSO4”将来自一个名为“公式”的变量,该变量由 raw_input 生成,如下所示:

formula = raw_input("Enter formula: ")

完整的程序代码可以在这里找到,我在下面包含了更相关的部分。提前感谢您的帮助!

formula = raw_input("Enter formula: ")


[a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]

weight_sum = sum(float(formul_data.get(elem.lower())) for elem in elements)
print "Total weight =", weightSum
4

3 回答 3

3

如果您的目标是能够将构成分子的原子的分子量相加,我建议您对正则表达式进行一些不同的处理。不要将数字与拆分列表中的元素符号混合,而是将它们附加到前面的元素(如果没有数字,则附加 1)。这是我的做法:

import re

# a partial table of atomic weights, replace with something better!
weights = { "H" : 1,  "Na": 11, "Mg": 12, "C" : 12, "N" : 14,
            "O" : 16, "F" : 19, "Al": 27, "S" : 32, "Cl": 35, 
      }

def molecularWeight(formula):
    matches = re.findall(r"([A-Z][a-z]?)([0-9]*)", formula)
    return sum(weights[symbol] * (int(count) if count else 1)
               for (symbol, count) in matches)

为了使它适合您显示的代码,请替换weights[symbol]为类似的东西formul_data.get(symbol.lower(), 0)(或在代码中通过符号获得适当的原子量所需的任何东西)。

只要没有括号,这应该处理任何经验公式和许多结构公式。要解决带括号的公式,您需要制作更好的解析器,因为简单的正则表达式不起作用。

于 2012-08-25T21:22:36.963 回答
1

运行后

>>> import re
>>> elements = [a for a in re.split(r'([A-Z][a-z]*)', 'MgSO4') if a]

您可以使用索引访问拆分的部分

>>> print elements[0]
'Mg'
>>> print elements[-1]  # print the last element
'4'
于 2012-08-25T20:29:13.590 回答
1

这只是一个猜测,但您可能没有意识到re.split代码可以应用于任何字符串,包括您从中读取的字符串raw_input。这是你要求的吗?

formula = raw_input("Enter formula: ")

elements = [a for a in re.split(r'([A-Z][a-z]*)', formula) if a]

weight_sum = sum(float(formul_data.get(elem.lower(), 0)) for elem in elements)
print "Total weight =", weight_sum
于 2012-08-25T20:58:54.447 回答