5

我目前有以下代码,它在字符串“公式”中查找大写字母:http: //pastebin.com/syRQnqCP

现在,我的问题是,如何更改该代码(忽略“if choice = 1:”循环中的位),以便将新分解的字符串的每个部分放入它自己的变量中?

例如,放入 NaBr 会导致字符串被分解为“Na”和“Br”。我需要将它们放在单独的变量中,以便我可以在我的 CSV 文件中查找它们。最好它是一种生成的东西,所以如果有 3 个元素,比如 MgSO4,O 将被放入一个单独的变量中,比如 Mg 和 S。

如果不清楚,请告诉我,我会尝试让它更易于理解......不过,目前还没有办法这样做。:(

编辑:相关代码:

功能:

def split_uppercase(string):
x=''
for i in string: 
    if i.isupper(): x+=' %s' %i 
    else: x+=i 
return x.strip()

字符串输入和查找:

formula = raw_input("Enter formula: ")
upper = split_uppercase(formula)

#Pull in data from form.csv
weight1 = float(formul_data.get(element1.lower()))
weight2 = float(formul_data.get(element2.lower()))
weight3 = float(formul_data.get(element3.lower()))


weightSum = weight1 + weight2 + weight3
print "Total weight =", weightSum
4

2 回答 2

21

我认为有一种更简单的方法来做你想做的事情。使用正则表达式。例如:

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

如果您希望将数字附加到正确的元素,只需在正则表达式中添加一个数字说明符:

>>> [a for a in re.split(r'([A-Z][a-z]*\d*)', txt) if a]
[u'Mg', u'S', u'O4']

您真的不想“将每个部分放在自己的变量中”。这通常没有意义,因为您不知道有多少部分,因此您无法提前知道要创建多少变量。相反,您想制作一个列表,就像上面的示例一样。然后,您可以遍历此列表并对每个部分执行您需要执行的操作。

于 2012-08-25T17:52:09.227 回答
11

您可以使用 re.split 对字符串执行复杂的拆分。

import re

def split_upper(s):
    return filter(None, re.split("([A-Z][^A-Z]*)", s))

>>> split_upper("fooBarBaz")
['foo', 'Bar', 'Baz']
>>> split_upper("fooBarBazBB")
['foo', 'Bar', 'Baz', 'B', 'B']
>>> split_upper("fooBarBazBB4")
['foo', 'Bar', 'Baz', 'B', 'B4']
于 2012-08-25T18:05:39.310 回答