web-dev-qa-db-ja.com

Pythonの文字列から数値を抽出

私はPythonが初めてで、文字列があります。文字列から数値を抽出したいです。例えば:

str1 = "3158 reviews"
print (re.findall('\d+', str1 ))

出力は['4', '3']です

リストとしてではなく、できれば整数として3158のみを取得したい。

25
Umair

filterは、digitsを使用して文字列をstr.isdigitメソッドを使用して、

>>> int(filter(str.isdigit, str1))
3158
78
Vishnu Upadhyay

このコードは正常に機能します。間違いなく他の問題があります:

>>> str1 = "3158 reviews"
>>> print (re.findall('\d+', str1 ))
['3158']
26
Irshad Bhat

正規表現は正しいようです。変数名を間違えていませんか?上記のコードでは、total_hotel_reviews_stringstrを混在させています。

>>> import re
>>> s = "3158 reviews"
>>> print re.findall("\d+", s)
['3158']
8
hellobenallan

形式がそのように単純な場合(スペースが数字を残りの数字から分離します)

int(str1.split()[0])

それをするだろう

7
6502
IntVar = int("".join(filter(str.isdigit, StringVar)))
3
Bernard

文字列から単一の数値を抽出するには、 re.search() を使用します。これは最初の一致(またはNone)を返します。

>>> import re
>>> string = '3158 reviews'
>>> int(re.search(r'\d+', string).group(0))
3158
3
Eugene Yarmash

Vishnuの答えからのコードには少し問題があるかもしれません。文字列に数字がない場合、ValueErrorを返します。これを避けるための私の提案があります:

>>> digit = lambda x: int(filter(str.isdigit, x) or 0)
>>> digit('3158 reviews')
3158
>>> digit('reviews')
0
1
M.Danilchenko
a = []
line = "abcd 3455 ijkl 56.78 ij"
for Word in line.split():
 try:
  a.append(float(Word))
  except ValueError:
  pass
print(a)

出力

3455.0 56.78
0
Ayush Singh

私の答えは追加のライブラリを必要とせず、理解するのは簡単です。しかし、文字列内に複数の数字がある場合、私のコードはそれらを一緒に連結することに注意する必要があります。

def Search_number_String(String):
    index_list = []
    del index_list[:]
    for i, x in enumerate(String):
        if x.isdigit() == True:
            index_list.append(i)
    start = index_list[0]
    end = index_list[-1] + 1
    number = String[start:end]
    return number
0
Yang Qi

私はコーディングの初心者です。これは質問に答える私の試みです。ライブラリをインポートせずにPython3.7バージョンを使用しました。

このコードは、空白(単語)で区切られた文字セットで構成される文字列から10進数を抽出して返します。

注意:複数の数値がある場合、最後の値を返します。

line = input ('Please enter your string ')
for Word in line.split():
    try:
        a=float(Word)
        print (a)
    except ValueError:
        pass

上記のソリューションは整数を想定しているようです。以下は、小数を許可するための小さな変更です。

num = float("".join(filter(lambda d: str.isdigit(d) or d == '.', inputString)

(-記号を考慮せず、英語のピリオドだけでなく、ピリオドが数字文字列に適切に配置されていることを前提としています。それは破壊できないように構築されていませんが、私のデータケースで機能しました。)

0
thund