Heim >Backend-Entwicklung >Python-Tutorial >Warum gibt „re.findall' beim Abgleichen von Zahlen in Python eine leere Liste zurück?

Warum gibt „re.findall' beim Abgleichen von Zahlen in Python eine leere Liste zurück?

Barbara Streisand
Barbara StreisandOriginal
2024-12-27 01:20:10765Durchsuche

Why Does `re.findall` Return an Empty List When Matching Numbers in Python?

re.findall verhält sich inkonsistent

Beim Versuch, re.findall zum Abgleichen numerischer Werte in einer Zeichenfolge zu verwenden, ist einigen Benutzern ein unerwartetes Verhalten aufgefallen . Während re.search Übereinstimmungen genau abruft, gibt re.findall eine leere Liste zurück. Diese offensichtliche Ungleichheit kann auf die folgenden Faktoren zurückgeführt werden:

Erfassen von Gruppen und re.findall

Ein wichtiger Punkt, den Sie beachten sollten, ist, dass re.findall erfassten Text erfasst, wenn der Regex-Muster enthält Erfassungsgruppen. Wie in der Referenz definiert, gibt re.findall eine Liste von Gruppen zurück, wenn ein Muster erfassende Gruppen enthält, möglicherweise in Form von Tupeln für Muster mit mehreren Gruppen. Insbesondere werden sogar leere Übereinstimmungen in die Ausgabe einbezogen, es sei denn, sie gehen unmittelbar einer anderen Übereinstimmung voraus.

Nicht erfassende Gruppen und wörtliches Escaping

Im bereitgestellten Beispiel ist das spezifische Das Problem ergibt sich aus der Verwendung von \ innerhalb von r''-String-Literalen. Dieses Konstrukt versucht, eine Übereinstimmung mit einem Literal zu finden, und nicht mit der beabsichtigten Bedeutung der Übereinstimmung mit einem einzelnen Zeichen (außer einem Zeilenumbruch). Um numerische Werte korrekt abzugleichen, sollte das Muster wie folgt geändert werden:

-?\d*\.?\d+

Dieses Muster umfasst die folgenden Erfassungsgruppen:

  • -? - Optionales Minuszeichen
  • d* - Optionale Ziffern
  • . - Optionales Dezimaltrennzeichen
  • d - Eine oder mehrere Ziffern

Demonstration

Hier ist eine IDEONE-Demonstration des überarbeiteten Musters:

import re
s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?\d*\.?\d+'
L = re.findall(pattern, s)
print(L)

Dieses Muster ruft die erwartete Liste numerischer Übereinstimmungen korrekt ab: ['123', '3.1415926'].

Durch die Berücksichtigung der Art der Erfassung von Gruppen und der angemessenen Verwendung von Literal-Escapen können Entwickler sicherstellen, dass re.findall in ihren Skripten wie vorgesehen funktioniert.

Das obige ist der detaillierte Inhalt vonWarum gibt „re.findall' beim Abgleichen von Zahlen in Python eine leere Liste zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn