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
Linda HamiltonOriginal
2024-12-19 09:23:09133Durchsuche

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'

Und das folgende Muster:

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

Mit re.search bekommen wir das Richtige Ergebnis:

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

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

L = re.findall(pattern, s)
print(L)  # []

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+'

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']

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!

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