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' と呼ばれる変数から来ています。

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

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 に答える