Heim > Backend-Entwicklung > Python-Tutorial > Warum gibt „re.findall()' eine leere Liste zurück, wenn „re.search()' eine Übereinstimmung findet?

Warum gibt „re.findall()' eine leere Liste zurück, wenn „re.search()' eine Übereinstimmung findet?

Linda Hamilton
Freigeben: 2024-12-19 09:23:09
Original
117 Leute haben es durchsucht

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall-Verhalten

Die re.findall()-Funktion kann verwirrend sein, wenn sie nicht die erwarteten Ergebnisse zurückgibt passend zu einer Zeichenfolge. Lassen Sie uns die Gründe für sein Verhalten in einem bestimmten Fall untersuchen.

Problemstellung

Bedenken Sie die folgende Quellzeichenfolge:

s = r'abc123d, hello 3.1415926, this is my book'
Nach dem Login kopieren

Und das folgende Muster:

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
Nach dem Login kopieren

Mit re.search bekommen wir das Richtige Ergebnis:

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>
Nach dem Login kopieren

Re.findall gibt jedoch eine leere Liste zurück:

L = re.findall(pattern, s)
print(L)  # []
Nach dem Login kopieren

Das Problem verstehen

Es gibt zwei Zu berücksichtigende Schlüsselaspekte:

  1. Empty Match Capture Gruppen: re.findall gibt erfasste Texte vom Match-Objekt zurück, aber in diesem Muster gibt es keine erfassenden Gruppen. Als Ergebnis werden leere Zeichenfolgen zurückgegeben.
  2. Zeichen-Escapezeichen: Das \. im Muster entspricht zwei Zeichen: und jedem Zeichen außer Newline. Dies ist nicht für den Abgleich numerischer Werte gedacht.

Lösung

Um numerische Werte korrekt abzugleichen, verwenden Sie stattdessen das folgende Muster:

pattern = r'-?\d*\.?\d+'
Nach dem Login kopieren

Dieses Muster entspricht:

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

Mit diesem korrigierten Muster gibt re.findall die erwartete Liste zurück:

['123', '3.1415926']
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum gibt „re.findall()' eine leere Liste zurück, wenn „re.search()' eine Übereinstimmung findet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage