用大写字母拆分字符串

时间:2012-08-25 17:46:02

标签: python

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

现在,我的问题是,如何更改代码(忽略"如果选择= 1:"循环中的位),以便将新分解的字符串的每个部分放入其中& #39;自己的变量?

例如,放入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

2 个答案:

答案 0 :(得分:18)

我认为有一种更容易的方法可以做你想做的事情。使用正则表达式。例如:

>>> [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']

你真的不想“把每个部分放在自己的变量中”。这一般没有意义,因为您不知道有多少部分,所以您无法知道要提前创建多少变量。相反,您想要制作一个列表,就像上面的例子一样。然后你可以迭代这个列表并做你需要做的每一件事。

答案 1 :(得分:9)

您可以使用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']