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]
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]
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]
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
@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)
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 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.
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.'''