Как извлечь числа из строки в Python? - PullRequest
355 голосов
/ 27 ноября 2010

Я бы извлек все числа, содержащиеся в строке. Что лучше подходит для этой цели, регулярных выражений или метода isdigit()?

Пример:

line = "hello 12 hi 89"

Результат:

[12, 89]

Ответы [ 14 ]

2 голосов
/ 18 апреля 2019

Я просто добавляю этот ответ, потому что никто не добавил его, используя обработку исключений, и потому что это также работает для чисел с плавающей запятой

a = []
line = "abcd 1234 efgh 56.78 ij"
for word in line.split():
    try:
        a.append(float(word))
    except ValueError:
        pass
print(a)

Вывод:

[1234.0, 56.78]
2 голосов
/ 02 июня 2017

Поскольку ни один из них не касался реальных финансовых показателей в Excel и Word Docs, которые мне нужно было найти, вот мой вариант.Он обрабатывает целые числа, числа с плавающей запятой, отрицательные числа, номера валют (потому что он не отвечает на разделение), и имеет возможность удалить десятичную часть и просто вернуть целые числа или вернуть все.

Он также обрабатывает систему счисления Индийских Лаков, в которой запятые появляются нерегулярно, а не через каждые 3 числа.

Он не обрабатывает научные обозначения или отрицательные числа, заключенные в скобки в бюджетах, - будет выглядеть положительно.

Также не извлекает даты.Есть лучшие способы поиска дат в строках.

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
1 голос
/ 16 ноября 2014

@ jmnas, мне понравился твой ответ, но он не нашел поплавков. Я работаю над сценарием для анализа кода, идущего на станки с ЧПУ, и мне нужно было найти измерения X и Y, которые могут быть целыми или плавающими, поэтому я адаптировал ваш код к следующему. Это находит int, float с положительными и отрицательными значениями. Все еще не находит значения в шестнадцатеричном формате, но вы можете добавить «x» и «A» через «F» к кортежу num_char, и я думаю, что он будет анализировать такие вещи, как «0x23AC».

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)
0 голосов
/ 11 августа 2015

Лучший вариант, который я нашел ниже. Он извлечет число и может уничтожить любой тип символа.

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)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...