5

私は現在、文字列「式」で大文字を見つける次のコードを持っています: http://pastebin.com/syRQnqCP

さて、私の質問は、そのコードを変更して (「if choice = 1:」ループ内のビットを無視して)、新しく分割された文字列の各部分が独自の変数に入れられるようにするにはどうすればよいかということです。

たとえば、NaBr を入力すると、文字列は "Na" と "Br" に分割されます。CSV ファイルで検索できるように、これらを個別の変数に入れる必要があります。生成されたものであることが望ましいので、MgSO4 のように 3 つの要素がある場合、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 に答える