Ich würde alle in einer Zeichenfolge enthaltenen Zahlen extrahieren. Welches ist für den Zweck, reguläre Ausdrücke oder die isdigit()
Methode besser geeignet ?
Beispiel:
line = "hello 12 hi 89"
Ergebnis:
[12, 89]
Wenn Sie 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 aus drei Gründen besser ist als das Regex-Beispiel. Erstens benötigen Sie kein weiteres Modul. Zweitens ist es besser lesbar, da Sie die Regex-Minisprache nicht analysieren müssen. und drittens ist es schneller (und damit wahrscheinlich pythonischer):
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 keine Gleitkommazahlen, negativen Ganzzahlen oder Ganzzahlen im Hexadezimalformat. Wenn Sie diese Einschränkungen nicht akzeptieren können, reicht die unten stehende Antwort von slim aus .
re
. Es ist ein allgemeines und leistungsfähiges Werkzeug (damit Sie etwas sehr Nützliches lernen). Die Geschwindigkeit spielt beim Parsen von Protokollen keine Rolle (es ist schließlich kein intensiver numerischer Löser). Dasre
Modul befindet sich in der Standard-Python-Bibliothek und es tut nicht weh, es zu laden.mumblejumble45mumblejumble
in denen ich wusste, dass es nur eine Nummer gab. Die Lösung ist einfachint(filter(str.isdigit, your_string))
.str
die dann dasstr
Objekt und die Methode in Base Python überschreibt . Dies ist keine gute Vorgehensweise, da Sie sie möglicherweise später im Skript benötigen.int(filter(...))
wirdTypeError: int() argument must be a string...
für Python 3.5 ausgelöst, sodass Sie die aktualisierte Version verwenden können:int(''.join(filter(str.isdigit, your_string)))
zum Extrahieren aller Ziffern in eine Ganzzahl.Ich würde einen regulären Ausdruck verwenden:
Dies würde auch 42 von entsprechen
bla42bla
. Wenn Sie nur Zahlen möchten, die durch Wortgrenzen (Leerzeichen, Punkt, Komma) begrenzt sind, können Sie \ b verwenden:So erhalten Sie eine Liste mit Zahlen anstelle einer Liste mit Zeichenfolgen:
quelle
int
und fertig. +1 speziell für den letzten Teil. Ich würde allerdings rohe Strings (r'\b\d+\b' == '\\b\\d+\\b'
) vorschlagen .int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]
map
.Dies ist mehr als ein bisschen spät, aber Sie können den Regex-Ausdruck erweitern, um auch die wissenschaftliche Notation zu berücksichtigen.
Gibt alles gut!
Darüber hinaus können Sie sich den in AWS Glue integrierten regulären Ausdruck ansehen
quelle
s = "4"
. B. gibt es keine Übereinstimmungen zurück. Kann erneut bearbeitet werden, um dies auch zu erledigen?[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?
Diese Gruppe gibt einige Fehlalarme aus (dh+
wird manchmal von selbst erfasst), kann jedoch mehr Formulare verarbeiten, z. B..001
und kombiniert Zahlen nicht automatisch (wie ins=2+1
)[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?
- so dumm von mir ... wie konnte ich mir das nicht vorstellen?Ich gehe davon aus, dass Sie Floats nicht nur ganze Zahlen wollen, also würde ich so etwas tun:
Beachten Sie, dass einige der anderen hier veröffentlichten Lösungen nicht mit negativen Zahlen funktionieren:
quelle
float
zuint
.re.findall("[-\d]+", "1 -2")
continue
stattpass
in der Schleife schreiben ?Wenn Sie wissen, dass es nur eine Zahl in der Zeichenfolge ist, dh "Hallo 12 Hallo", können Sie versuchen, zu filtern.
Zum Beispiel:
Aber sei vorsichtig !!! ::
quelle
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'
- es mitint("".join(filter(str.isdigit, '200 grams')))
quelle
Ich suchte nach einer Lösung, um die Masken von Strings zu entfernen, insbesondere von brasilianischen Telefonnummern. Dieser Beitrag wurde nicht beantwortet, hat mich aber inspiriert. Das ist meine Lösung:
quelle
Die Verwendung von Regex unten ist der Weg
mit findall
re.findall(r'\d+', "hello 12 hi 89")
re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")
quelle
findall()
repl_str = re.compile('\d+.?\d*')
sollte sein:repl_str = re.compile('\d+\.?\d*')
Für ein reproduzierbares Beispiel mit Python3.7re.search(re.compile(r'\d+.?\d*'), "42G").group()
'42G're.search(re.compile(r'\d+\.?\d*'), "42G").group()
'42'Hallo ,
Sie können alle Ganzzahlen in der Zeichenfolge durch die Ziffer durchsuchen, indem Sie den Ausdruck findall verwenden.
Erstellen Sie im zweiten Schritt eine Liste res2 und fügen Sie die in der Zeichenfolge enthaltenen Ziffern zu dieser Liste hinzu
hoffe das hilft
Grüße, Diwakar Sharma
quelle
Diese Antwort enthält auch den Fall, dass die Zahl in der Zeichenfolge schwebt
quelle
Ich bin erstaunt zu sehen, dass noch niemand die Verwendung von erwähnt hat
itertools.groupby
als Alternative erwähnt hat, um dies zu erreichen.Sie können
itertools.groupby()
zusammen mitstr.isdigit()
verwenden, um Zahlen aus der Zeichenfolge zu extrahieren:Der gehaltene Wert
l
ist:PS: Dies dient nur zur Veranschaulichung, um zu zeigen, dass wir als Alternative auch
groupby
dies erreichen können. Dies ist jedoch keine empfohlene Lösung. Wenn Sie dies erreichen möchten, sollten Sie eine akzeptierte Antwort von fmark verwenden, die auf der Verwendung des Listenverständnisses mitstr.isdigit
als Filter basiert .quelle
Ich füge diese Antwort nur hinzu, weil niemand eine mit Ausnahmebehandlung hinzugefügt hat und weil dies auch für Floats funktioniert
Ausgabe :
quelle
Um unterschiedliche Muster zu erfassen, ist es hilfreich, mit unterschiedlichen Mustern abzufragen.
Richten Sie alle Muster ein, die unterschiedliche interessierende Zahlenmuster erfassen:
(findet Kommas) 12.300 oder 12.300,00
'[\ d] + [., \ d] +'
(findet Schwimmer) 0.123 oder .123
'[\ d] * [.] [\ d] +'
(findet ganze Zahlen) 123
'[\ d] +'
Kombinieren Sie mit Rohr (|) zu einem Muster mit mehreren oder Bedingungen .
(Hinweis: Setzen Sie komplexe Muster an die erste Stelle. Andernfalls geben einfache Muster Teile des komplexen Fangs zurück, anstatt dass der komplexe Fang den vollen Fang zurückgibt.)
Im Folgenden bestätigen wir, dass ein Muster vorhanden ist
re.search()
, und geben dann eine iterierbare Liste der Fänge zurück. Schließlich drucken wir jeden Fang in Klammernotation, um den Rückgabewert des Übereinstimmungsobjekts aus dem Übereinstimmungsobjekt auszuwählen.Kehrt zurück:
quelle
Da sich keines davon mit realen Finanzzahlen in Excel- und Word-Dokumenten befasste, die ich finden musste, ist hier meine Variation. Es verarbeitet Ints, Floats, negative Zahlen und Währungszahlen (da es beim Teilen nicht antwortet) und hat die Option, den Dezimalteil zu löschen und nur Ints zurückzugeben oder alles zurückzugeben.
Es behandelt auch das indische Laks-Zahlensystem, bei dem Kommas unregelmäßig erscheinen und nicht alle drei Zahlen voneinander entfernt sind.
Es behandelt keine wissenschaftliche Notation oder negative Zahlen in Klammern in Budgets - wird positiv erscheinen.
Es werden auch keine Daten extrahiert. Es gibt bessere Möglichkeiten, Datumsangaben in Zeichenfolgen zu finden.
quelle
@jmnas, ich mochte Ihre Antwort, aber es wurden keine Schwimmer gefunden. Ich arbeite an einem Skript zum Parsen von Code, der zu einer CNC-Fräse geht, und musste sowohl X- als auch Y-Dimensionen finden, die Ganzzahlen oder Gleitkommazahlen sein können. Deshalb habe ich Ihren Code an Folgendes angepasst. Dies findet int, float mit positiven und negativen Werten. Es werden immer noch keine hexadezimal formatierten Werte gefunden, aber Sie könnten dem
num_char
Tupel "x" und "A" bis "F" hinzufügen, und ich denke, es würde Dinge wie '0x23AC' analysieren.quelle
Die beste Option, die ich gefunden habe, ist unten. Es extrahiert eine Zahl und kann jede Art von Zeichen entfernen.
quelle
Bei Telefonnummern können Sie einfach alle nichtstelligen Zeichen mit \ D in Regex ausschließen:
quelle