31

たとえば、数値と単位を格納する文字列があります

x= '$120'
y = ' 90 Degrees F'
banana = '200 kgm'
orange = '300 gm'
total_weight = banana + orange/1000 

たとえば、重みを追加したい

total_weight  = 200 + 300/1000

ありがとう!

これらでいくつかの操作を行うためだけに数字を抽出しようとしています...これを行う最も簡単な方法は何ですか? 私はこれら2つの形式のみを扱っています。つまり、数字は文字列の先頭または末尾にあります...

4

5 に答える 5

67

文字列から数値を抽出する最も簡単な方法は、正規表現と を使用することfindallです。

>>> import re
>>> s = '300 gm'
>>> re.findall('\d+', s)
['300']
>>> s = '300 gm 200 kgm some more stuff a number: 439843'
>>> re.findall('\d+', s)
['300', '200', '439843']

もっと複雑なものが必要かもしれませんが、これは良い第一歩です。

int(別の文字列ではなく)適切な数値型を取得するには、結果を呼び出す必要があることに注意してください。

>>> map(int, re.findall('\d+', s))
[300, 200, 439843]
于 2012-04-28T16:09:42.287 に答える
31

を使用せずregexに、次のことができます。

def get_num(x):
    return int(''.join(ele for ele in x if ele.isdigit()))

結果:

>>> get_num(x)
120
>>> get_num(y)
90
>>> get_num(banana)
200
>>> get_num(orange)
300

編集 :

フォローアップの質問に答えます。

特定の文字列の唯一のピリオドが小数点であることがわかっている場合、float を抽出するのは非常に簡単です。

def get_num(x):
    return float(''.join(ele for ele in x if ele.isdigit() or ele == '.'))

結果:

>>> get_num('dfgd 45.678fjfjf')
45.678
于 2012-04-28T16:37:56.103 に答える
4

この正規表現はフロートも処理します

import re
re_float = re.compile(r'\d*\.?\d+')

重量単位をキャッチする式にグループを追加することもできます。

re_banana = re.compile(r'(?P<number>\d*\.?\d+)\s?(?P<uni>[a-zA-Z]+)')

このように名前付きグループにアクセスできますre_banana.match("200 kgm").group('number')

これは、始めるのに役立つはずだと思います。

于 2012-04-28T16:12:53.630 に答える
2
>>> x='$120'
>>> import string
>>> a=string.maketrans('','')
>>> ch=a.translate(a, string.digits)
>>> int(x.translate(a, ch))
120
于 2012-04-28T16:10:04.017 に答える
0

数値を使ってある種の数学を行っている場合は、単位も知りたいと思うかもしれません。入力制限 (入力文字列に単位と値のみが含まれる) を考えると、これは両方を正しく返す必要があります (単位を数学の一般的な単位に変換する方法を理解する必要があります)。

def unit_value(str):
    m = re.match(r'([^\d]*)(\d*\.?\d+)([^\d]*)', str)
    if m:
        g = m.groups()
        return ' '.join((g[0], g[2])).strip(), float(g[1])
    else:
        return int(str)
于 2012-04-28T16:32:01.437 に答える