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.'''

2voto

Avnish Jayaswal Punkte 29
str1 = "There are 2 apples for 4 persons"

# printing original string 
print("The original string : " + str1) # The original string : There are 2 apples for 4 persons

# using List comprehension + isdigit() +split()
# getting numbers from string 
res = [int(i) for i in str1.split() if i.isdigit()]

print("The numbers list is : " + str(res)) # The numbers list is : [2, 4]

2voto

Marc Maxmeister Punkte 3485

Da keines dieser Programme sich mit realen Finanzzahlen in Excel und Word-Dokumenten befasst, die ich finden musste, ist hier meine Variante. Es behandelt Ints, Floats, negative Zahlen, Währungszahlen (weil es nicht auf Split antwortet), und hat die Möglichkeit, den Dezimalteil wegzulassen und nur Ints zurückzugeben, oder alles zurückzugeben.

Es beherrscht auch das indische Laks-Zahlensystem, bei dem die Kommas unregelmäßig und nicht im Abstand von 3 Zahlen erscheinen.

Die wissenschaftliche Notation oder negative Zahlen in Klammern in Budgets werden nicht berücksichtigt - sie erscheinen positiv.

Es werden auch keine Daten extrahiert. Es gibt bessere Methoden, um Datumsangaben in Zeichenketten zu finden.

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

2voto

ZacSketches Punkte 353

@jmnas, Ihre Antwort hat mir gefallen, aber sie hat keine Schwimmer gefunden. Ich arbeite an einem Skript zum Parsen von Code für eine CNC-Fräse und musste sowohl die X- als auch die Y-Abmessungen finden, die Ganzzahlen oder Fließkommazahlen sein können, also habe ich Ihren Code wie folgt angepasst. Dieser findet int, float mit positiven und negativen Werten. Es findet immer noch keine hexadezimal formatierten Werte, aber man könnte "x" und "A" bis "F" zu den num_char Tupel und ich denke, es würde Dinge wie '0x23AC' analysieren.

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)

0voto

Ajay Kumar Punkte 326

Die beste Option, die ich gefunden habe, ist die folgende. Sie extrahiert eine Zahl und kann jede Art von Zeichen eliminieren.

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)

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