716 Stimmen

Wie extrahiert man Zahlen aus einer Zeichenkette in Python?

Ich möchte alle in einer Zeichenkette enthaltenen Zahlen extrahieren. Was ist für diesen Zweck besser geeignet, reguläre Ausdrücke oder die isdigit() Methode?

line = "hello 12 hi 89"

Ergebnis:

[12, 89]

4 Stimmen

Leider waren die Beispiel-Eingabedaten so simpel, dass sie zu naiven Lösungen einluden. Übliche Fälle sollten Eingabezeichenfolgen mit interessanteren Zeichen neben den Ziffern behandeln. Eine etwas anspruchsvollere Eingabe: '''gimme digits from "12", 34, '56', -789.'''

13voto

Diwakar SHARMA Punkte 545
line2 = "hello 12 hi 89"  # this is the given string 
temp1 = re.findall(r'\d+', line2) # find number of digits through regular expression
res2 = list(map(int, temp1))
print(res2)

Hallo ,

können Sie alle ganzen Zahlen in der Zeichenkette mit Hilfe des Ausdrucks findall suchen.

Im zweiten Schritt erstellen Sie eine Liste res2 und fügen die in string gefundenen Ziffern zu dieser Liste hinzu

Ich hoffe, das hilft

Grußworte, Diwakar Sharma

2 Stimmen

Die bereitgestellte Antwort wurde zur Überprüfung als Beitrag von geringer Qualität gekennzeichnet. Hier sind einige Richtlinien für Wie schreibe ich eine gute Antwort? . Diese Antwort mag zwar richtig sein, könnte aber eine Erläuterung vertragen. Antworten, die nur einen Code enthalten, werden nicht als "gute" Antworten angesehen. Von Überprüfung .

10voto

Raghav Punkte 183

Ich bin nur diese Antwort hinzufügen, weil niemand eine mit Ausnahmebehandlung hinzugefügt und weil dies auch für Floats funktioniert

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

Ausgang :

[1234.0, 56.78]

7voto

Menglong Li Punkte 2027

Diese Antwort enthält auch den Fall, dass die Zahl in der Zeichenkette float ist

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)

5voto

Moinuddin Quadri Punkte 43207

Ich bin erstaunt, dass noch niemand auf die Verwendung von itertools.groupby als Alternative zu erreichen.

Sie können verwenden itertools.groupby() zusammen mit str.isdigit() um Zahlen aus der Zeichenkette als zu extrahieren:

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]

Der Wert, der von l sein wird:

[12, 89]

PS: Dies dient nur zur Veranschaulichung, um zu zeigen, dass wir alternativ auch groupby um dies zu erreichen. Dies ist jedoch keine empfehlenswerte Lösung. Wenn Sie dies erreichen wollen, sollten Sie Folgendes verwenden akzeptierte Antwort von fmark basierend auf der Verwendung des Listenverständnisses mit str.isdigit als Filter.

3voto

Der sauberste Weg, den ich gefunden habe:

>>> data = 'hs122 125 &55,58, 25'
>>> new_data = ''.join((ch if ch in '0123456789.-e' else ' ') for ch in data)
>>> numbers = [i for i in new_data.split()]
>>> print(numbers)
['122', '125', '55', '58', '25']

oder dies:

>>> import re
>>> data = 'hs122 125 &55,58, 25'
>>> numbers = re.findall(r'\d+', data)
>>> print(numbers)
['122', '125', '55', '58', '25']

0 Stimmen

Die beiden vorgeschlagenen Lösungen sind nicht homogen. Diese Regex tut es: re.findall(r'[\d.e-]+', data)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X