質問
混合数と分数(文字列として)をフロートに変換する関数を作成したいと思います。いくつかの例があります:
'1 1/2' -> 1.5
'11/2' -> 5.5
'7/8' -> 0.875
'3' -> 3
'7.7' -> 7.7
現在、この機能を使用していますが、改善できると思います。また、既に10進表現にある数値も処理しません
def mixedtofloat(txt):
mixednum = re.compile("(\\d+) (\\d+)\\/(\\d+)",re.IGNORECASE|re.DOTALL)
fraction = re.compile("(\\d+)\\/(\\d+)",re.IGNORECASE|re.DOTALL)
integer = re.compile("(\\d+)",re.IGNORECASE|re.DOTALL)
m = mixednum.search(txt)
n = fraction.search(txt)
o = integer.search(txt)
if m:
return float(m.group(1))+(float(m.group(2))/float(m.group(3)))
elif n:
return float(n.group(1))/float(n.group(2))
elif o:
return float(o.group(1))
else:
return txt
ありがとう!
解決
2.6には fractions
モジュール。本格的に文字列を分割するだけで、チャンクを供給します fractions.Fraction()
, 、 電話 float()
結果に対して、それらをすべて追加します。
他のヒント
イグナシオの答えはおそらくそれを処理するための最良の方法ですが、Python 2.6を使用していない場合は、正規表現に頼らずにもう少し単純に実行する関数を構築できます。これは私が一緒に投げたシンプルであまり堅牢ではないバージョンです:
def parse_fraction(fraction):
def parse_part(part):
sections = part.split('/')
if len(sections) == 1:
return float(sections[0])
return float(sections[0]) / float(sections[1])
return sum( parse_part(part) for part in fraction.split() )
これは明らかに完璧ではありません。 '2 1/2 1/2'
, 、それがとして評価するでしょう 3
, 、それは基本的に、それぞれを必要に応じて分数として評価しながら、数値のスペースを区切られたリストを要約するからです。
正規表現ベースのソリューションに固執する場合は、生文字列を使用して、すべてを二重にバックスラッシュすることを避けることができることを知っておく必要があります。基本的に、あなたは書くことができます:
mixednum = re.compile(r"(\d+) (\d+)/(\d+)")
r
文字列の前では、Pythonに文字列内の特殊文字を評価しないように指示するので、文字通りのバックスラッシュを書くことができれば、そのように扱われます。また、Pythonの正規表現の特別なキャラクターではないため、スラッシュから逃れる必要はないことに注意してください(多くの言語のように、文字通りのregexpの境界線をマークするために使用されないためです)。 re.IGNORECASE
また、flagはregexpに数値エンティティのみが含まれているため、あまり意味がありません。 re.DOTALL
また、適用するドットがないため、意味がありません。
私は書いた Mixed
それを行うために分数を拡張するクラス。ソースはです ここ.
>>> float(Mixed('6 7/8'))
6.875
>>> float(Mixed(1,1,2)) # 1 1/2
1.5
>>> float(Mixed('11/2')) # 11/2
5.5