___ answer12999818 ___
dein Muster
%Vor%
entspricht der gesamten Zeichenfolge aabbaa. um zu klären, schau dir das einfach an
%Vor%
Auch keine anderen Teilstrings sollen dann
passen
%Vor%
, damit ein Fundall nur den einen Teilstring zurückgibt
%Vor%
___ qstntxt ___
Ich habe den Code:
%Vor%
Dies gibt aa
zurück
Wenn wir
haben
%Vor%
wir erhalten bb
Warum gibt es einen Unterschied und warum (für den ersten) bekommen wir nicht aa
?
Danke!
___ answer12999616 ___
Das unerwünschte Verhalten kommt auf die Art und Weise, wie Sie reguläre Ausdrücke formulieren:
%Vor%
Klammern bb
bildet eine Gruppe.
Und wenn wir uns die Dokumente von findall ansehen, werden wir folgendes sehen:
Geben Sie alle nicht überlappenden Übereinstimmungen des Musters in string als Liste von
Saiten. Die Zeichenfolge wird von links nach rechts gescannt und Übereinstimmungen zurückgegeben
in der Reihenfolge gefunden. Wenn eine oder mehrere Gruppen im Muster vorhanden sind ,
gibt eine Liste mit Gruppen zurück ; Dies wird eine Liste von Tupeln sein, wenn das Muster
hat mehr als eine Gruppe. Leere Treffer sind im Ergebnis enthalten
es sei denn, sie berühren den Beginn eines anderen Spiels. **
Als du eine Gruppe gebildet hast, wurde zuerst aa
, dann bb
und dann wieder aa
(wegen bb
quantifier) berechnet. Diese Gruppe enthält also am Ende aaxaabbxaa
. Und aa,bb,aa
gibt diesen Wert in der Liste aa
zurück (da es nur eine Übereinstimmung x
des gesamten Ausdrucks gibt, enthält die Liste nur ein Element aa
, das in der Gruppe gespeichert ist).
Aus dem Code, den Sie angegeben haben, wollten Sie Folgendes tun:
%Vor%
bb
erstellt keine Gruppe, daher gibt x
die Übereinstimmung des gesamten Ausdrucks zurück.
Am Ende Ihrer Frage zeigen Sie die gewünschte Ausgabe. Dies wird erreicht, indem Sie einfach nach bb
oder aa
suchen. Es werden keine Quantoren ( aa,bb,aa
oder aa
) benötigt. Mach es einfach so, wie es in der Antwort von Inbar Rose steht:
%Vor%
___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen.
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend.
___ answer12999497 ___
Ich verstehe nicht, warum Sie + verwenden - es bedeutet 0 oder 1 Vorkommen und wird normalerweise verwendet, wenn Sie einen String mit optionaler Einbeziehung der Teilzeichenfolge suchen möchten.
%Vor%
funktioniert wie erwartet
___ qstnhdr ___ Python re.findall () funktioniert nicht wie erwartet
___ antwort12999614 ___
lassen Sie mich erklären, was Sie tun:
%Vor%
Sie erstellen eine Regex, die nach bb
oder +
sucht und dann nach weiteren aa
oder bb
sucht und nach %code% oder% sucht co_de%, bis es nicht gefunden wird. Da Sie möchten, dass Ihre Erfassungsgruppe nur die %code% oder %code% zurückgibt, erhalten Sie nur die letzte erfasste / gefundene Gruppe.
Wenn Sie jedoch eine Zeichenfolge wie diese haben: %code% erhalten Sie %code% , weil Sie zuerst die Zeichenfolge anschauen und %code% finden, dann suchen Sie nach mehr und finden nur eine %code% , also Du hast 1 Gruppe. dann findest du ein anderes %code% , aber dann findest du ein %code% und dann ein %code% , also hörst du auf und du hast deine zweite Gruppe, die %code% ist. dann findest du ein weiteres %code% . und so ist dein Endergebnis %code%
Ich hoffe, das erklärt, was Sie tun. und es ist wie erwartet. Um eine Gruppe von %code% oder %code% zu erhalten, müssen Sie die %code% entfernen, die der Regex vorgibt, mehrere Gruppen zu suchen, bevor eine Übereinstimmung zurückgegeben wird. und nur Regex gibt jede Übereinstimmung von %code% oder %code% ...
zurück
so sollte Ihre Regex sein:
%Vor%
Prost.
___