2012-08-25 34 views
3

目前,我有下面的代碼,它認爲大寫字母串「公式」:http://pastebin.com/syRQnqCP將字符串分割用大寫字母

現在,我的問題是,我怎麼可以改變的代碼(忽略內部的位「如果選擇= 1:」循環),以便將新分解的字符串的每個部分放入它自己的變量中?

例如,放入NaBr會導致字符串被分解爲「Na」和「Br」。我需要把它們放在單獨的變量中,以便我可以在CSV文件中查找它們。 最好它是一種生成的東西,所以如果有三個元素,如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 
+0

請您在此發佈您的代碼的相關部分嗎? – Levon

+0

不好意思,認爲最好是有完整的代碼,以免混淆不同的東西。相關部分現在在帖子中。 – dantdj

+1

謝謝..它只是使它更容易(你可以肯定,人們*會*要求更多的代碼,如果他們覺得他們需要它:) – Levon

回答

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

你不是真的想「把每個部分在其自己的變量」。這通常是沒有意義的,因爲你不知道有多少部分,所以你不知道提前創建多少個變量。相反,你想製作一個列表,就像上面的例子。然後你可以遍歷這個列表,並做每件事你需要做的。

+0

+1使用're.split()'(我正要去建議),並建議使用列表來存儲結果,而不是處理未知數量的變量 – Levon

+0

我希望他們在不同的變量中唯一的原因是查找,因爲我最終會找到重量和將它們添加到一起,就像在pastebin上的完整代碼中的「if choice = 1:」部分中一樣。不過,我會研究你所描述的,歡呼。快速的說明,這將來自raw_input,所以我不知道如何用代碼中的MgSO4替換raw_input中的條目。 – dantdj

+0

@dantdj:但看看你的體重代碼。你有三行只有名字不同。如果你使用一個列表,你可以簡單地在元素中編寫'weight_sum = sum(float(formul_data.get(elem.lower())),等等,然後你可以處理任意數量的元素。 [當然,只需稍作調整即可。] – DSM

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