Python: Zahlen aus einer Zeichenfolge extrahieren

Ich würde alle in einem String enthaltenen Zahlen extrahieren. Welches ist besser geeignet für den Zweck, reguläre Ausdrücke oder die isdigit() Methode?

Beispiel:

 line = "hello 12 hi 89" 

Ergebnis:

 [12, 89] 

10 Solutions collect form web for “Python: Zahlen aus einer Zeichenfolge extrahieren”

Wenn Sie nur nur positive Ganzzahlen extrahieren möchten, versuchen Sie Folgendes:

 >>> str = "h3110 23 cat 444.4 rabbit 11 2 dog" >>> [int(s) for s in str.split() if s.isdigit()] [23, 11, 2] 

Ich würde argumentieren, dass dies besser ist als das Regex-Beispiel aus drei Gründen. Zuerst brauchst du kein anderes Modul. Zweitens ist es lesbarer, weil man die regex-mini-sprache nicht parsen muss; Und drittens ist es schneller (und damit wahrscheinlich mehr pythonisch):

 python -m timeit -s "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "[s for s in str.split() if s.isdigit()]" 100 loops, best of 3: 2.84 msec per loop python -m timeit -s "import re" "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "re.findall('\\b\\d+\\b', str)" 100 loops, best of 3: 5.66 msec per loop 

Dies erkennt Schwimmer, negative Ganzzahlen oder Ganzzahlen im hexadezimalen Format nicht. Wenn Sie diese Einschränkungen nicht akzeptieren können, wird die schlanke Antwort unten den Trick machen.

Ich würde eine regexp verwenden:

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

Das würde auch 42 von bla42bla . Wenn du nur Zahlen willst, die durch Wortgrenzen (Raum, Periode, Komma) begrenzt sind, kannst du \ b verwenden:

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

Um am Ende mit einer Liste von Zahlen anstelle einer Liste von Zeichenfolgen:

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

Ich gehe davon aus, dass du Schwimmer nicht nur ganzzahlen willst, also würde ich so etwas machen:

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

Beachten Sie, dass einige der anderen Lösungen hier nicht mit negativen Zahlen arbeiten:

 >>> re.findall(r'\b\d+\b', 'he33llo 42 I\'ma 32 string -30') ['42', '32', '30'] >>> '-3'.isdigit() False 

Das ist mehr als ein bisschen spät, aber du kannst den Regex-Ausdruck auch auf die wissenschaftliche Notation ausdehnen.

 >>> ss = ["apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3", 'hello X42 I\'ma Y-32.35 string Z30', 'he33llo 42 I\'ma 32 string -30', 'h3110 23 cat 444.4 rabbit 11 2 dog', "hello 12 hi 89"] >>> for s in ss: ... print re.findall("[-+]?\d+[\.]?\d*[eE]?[-+]?\d*", s) ... ['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3'] ['42', '-32.35', '30'] ['33', '42', '32', '-30'] ['3110', '23', '444.4', '11'] ['12', '89'] 

Wenn du weißt, dass es nur eine Nummer in der Saite sein wird, dh 'hallo 12 hi', kannst du Filter probieren.

Beispielsweise:

 In [1]: int(filter(str.isdigit, '200 grams')) Out[1]: 200 In [2]: int(filter(str.isdigit, 'Counters: 55')) Out[2]: 55 In [3]: int(filter(str.isdigit, 'more than 23 times')) Out[3]: 23 

Aber seien Sie vorsichtig !!! :

 In [4]: int(filter(str.isdigit, '200 grams 5')) Out[4]: 2005 

Diese Antwort enthält auch den Fall, wenn die Nummer in der Zeichenfolge 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) 

Ich bin erstaunt zu sehen, dass noch niemand den Gebrauch von itertools.groupby als eine Alternative erwähnt hat, um dies zu erreichen.

Sie können itertools.groupby() zusammen mit str.isdigit() verwenden, um Zahlen aus String als:

 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 gilt für l :

 [12, 89] 

Da keiner von ihnen mit realen Weltfinanzzahlen in Excel und Word Docs, die ich brauchte zu finden, hier ist meine Variation. Es handelt sich um Ints, Floats, negative Zahlen, Währungsnummern (weil es nicht auf Split antwortet) und hat die Möglichkeit, den Dezimalteil zu löschen und einfach zurückzukehren oder alles zurückzugeben.

Es behandelt auch Indian Laks Nummernsystem, wo Kommas unregelmäßig erscheinen, nicht alle 3 Zahlen auseinander.

Es geht nicht um wissenschaftliche Notation oder negative Zahlen in Klammern in Budgets gesetzt – wird positiv erscheinen.

Es extrahiert auch keine Daten. Es gibt bessere Möglichkeiten, Daten in Strings 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 

@jmnas, ich mochte Ihre Antwort, aber es fand keine Schwimmer. Ich arbeite an einem Skript, um Code zu einer CNC-Mühle zu analysieren und musste sowohl X- als auch Y-Dimensionen finden, die ganze Zahlen oder Floats sein können. Daher habe ich deinen Code an die folgenden angepasst. Das findet int, schwimmt mit positiven und negativen vals. Immer noch nicht finden Hex-formatierte Werte, aber Sie könnten hinzufügen "x" und "A" durch "F", um die num_char Tupel und ich denke, es würde Dinge wie '0x23AC' zu analysieren.

 s = 'hello X42 I\'ma 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) 

Die beste Option, die ich gefunden habe, ist unten. Es wird die Zahl extrahieren und kann jede Art von char 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) 
  • Wie erstelle ich N-Tupel in Python?
  • Python: Numpy Default auf float32 machen
  • Gibt es eine Möglichkeit, Zahlwörter in Integers umzuwandeln?
  • Wie stelle ich sicher, dass meine matplotlib-Achsen eine benutzerdefinierte Klasse sind?
  • Python erweiterte Zuordnung Problem
  • Python - Überprüfen Sie, ob die letzten Zeichen in einem String Zahlen sind
  • Wie man Arrays mit negativen Werten auf Bruchkraft in Python hebt?
  • Python, Prime Number Checker
  • Wie schreibe ich Tests richtig mit unittest?
  • Python ist die beste Programmiersprache der Welt.