Python:文字列から数値を抽出する



4 Answers

私は正規表現を使用する:

>>> import re
>>> re.findall(r'\d+', 'hello 42 I\'m a 32 string 30')
['42', '32', '30']

これは、 bla42blaから42とbla42blaます。 単語の境界(スペース、ピリオド、コンマ)で区切られた数字のみを使用する場合は、\ b:

>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30')
['42', '32', '30']

文字列のリストの代わりに数字のリストを表示するには:

>>> [int(s) for s in re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30')]
[42, 32, 30]
Question

私は文字列に含まれるすべての数字を抽出します。 目的、正規表現、またはisdigit()メソッドに適しているのはどちらですか?

例:

line = "hello 12 hi 89"

結果:

[12, 89]



これらのどれもが私が見つけ出す必要があったExcelとWord文書の実世界の財務番号を扱っていないので、ここに私のバリエーションがあります。 int、浮動小数点数、負の数値、通貨の数値(splitで応答しないので)を扱い、小数点以下を切り捨ててintを返すか、すべてを返すかを選択できます。

カンマが不規則に現れるインディアン・レイクス・ナンバー・システムも扱っています。

予算内のカッコ内に置かれた科学的表記法や負の数値は処理されません。

また、日付を抽出しません。 文字列で日付を見つけるより良い方法があります。

import re
def find_numbers(string, ints=True):            
    numexp = re.compile(r'[-]?\d[\d,]*[\.]?[\d{2}]*') #optional - in front
    numbers = numexp.findall(string)    
    numbers = [x.replace(',','') for x in numbers]
    if ints is True:
        return [int(x.replace(',','').split('.')[0]) for x in numbers]            
    else:
        return numbers



誰もまだこれを達成するための代替手段としてitertools.groupbyの使用法について言及していないことに驚いています。

文字列から数値を抽出するには、 itertools.groupby一緒にstr.isdigit()を使用します:

from itertools import groupby
my_str = "hello 12 hi 89"

l = [int(''.join(i)) for is_digit, i in groupby(my_str, str.isdigit) if is_digit]

lの値は次のようになります。

[12, 89]

PS:これは、これを実現するためにgroupbyを使用することも可能であることを示すための例示です。 しかし、これは推奨される解決策ではありません。 これを実現するには、フィルタとしてstr.isdigitを使用してリスト内包を使用することに基づいて、fmarkの受け入れられた回答を使用する必要があります。




私は浮動小数点数だけでなく、私はこのような何かをしたいと思います:

l = []
for t in s.split():
    try:
        l.append(float(t))
    except ValueError:
        pass

ここに掲載されている他のソリューションのいくつかは、負の数では機能しないことに注意してください。

>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string -30')
['42', '32', '30']

>>> '-3'.isdigit()
False



@jmnas、私はあなたの答えが好きでしたが、浮きが見つかりませんでした。 私はコードを解析してCNCミルに行くスクリプトを作成しており、整数または浮動小数点数のXとYの次元を見つける必要があったので、私はあなたのコードを以下のように修正しました。 これはintを見つけ、正と負の値で浮動小数点数を返します。 まだ16進形式の値は見つかりませんでしたが、 "x"と "A"を "F"からnum_charタプルに追加すると、 num_charようなものを解析すると思います。

s = 'hello X42 I\'m a Y-32.35 string Z30'
xy = ("X", "Y")
num_char = (".", "+", "-")

l = []

tokens = s.split()
for token in tokens:

    if token.startswith(xy):
        num = ""
        for char in token:
            # print(char)
            if char.isdigit() or (char in num_char):
                num = num + char

        try:
            l.append(float(num))
        except ValueError:
            pass

print(l)



Related