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





7 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]
のみ 正規表現 数字のみ

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

例:

line = "hello 12 hi 89"

結果:

[12, 89]



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

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



この答えには、数値が文字列内で浮動する場合も含まれます

def get_first_nbr_from_str(input_str):
    '''
    :param input_str: strings that contains digit and words
    :return: the number extracted from the input_str
    demo:
    'ab324.23.123xyz': 324.23
    '.5abc44': 0.5
    '''
    if not input_str and not isinstance(input_str, str):
        return 0
    out_number = ''
    for ele in input_str:
        if (ele == '.' and '.' not in out_number) or ele.isdigit():
            out_number += ele
        elif out_number:
            break
    return float(out_number)



誰もまだこれを達成するための代替手段として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の受け入れられた回答を使用する必要があります。




これらのどれもが私が見つけ出す必要があった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



私が見つけた最良の選択肢は以下の通りです。 それは数字を抽出し、どんなタイプの文字も取り除くことができます。

def extract_nbr(input_str):
    if input_str is None or input_str == '':
        return 0

    out_number = ''
    for ele in input_str:
        if ele.isdigit():
            out_number += ele
    return float(out_number)    



これらの行がテキストファイルに2つあり、行ごとに保存したい場合はどうなりますか?




Related