Python re.findall () funktioniert nicht wie erwartet

8

Ich habe den Code:

%Vor%

Dies gibt ['aa']

zurück

Wenn wir

haben %Vor%

wir erhalten ['aa','aa']

Warum gibt es einen Unterschied und warum (für den ersten) bekommen wir nicht ['aa','bb','aa'] ?

Danke!

    
Dale Myers 21.10.2012, 15:50
quelle

4 Antworten

5
___ 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.

    
___
Inbar Rose 21.10.2012, 16:12
quelle
7

Das unerwünschte Verhalten kommt auf die Art und Weise, wie Sie reguläre Ausdrücke formulieren:

%Vor%

Klammern (aa|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 + quantifier) ​​berechnet. Diese Gruppe enthält also am Ende aa . Und findall gibt diesen Wert in der Liste ['aa'] zurück (da es nur eine Übereinstimmung aabbaa 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%

(?: ...) erstellt keine Gruppe, daher gibt findall die Übereinstimmung des gesamten Ausdrucks zurück.

Am Ende Ihrer Frage zeigen Sie die gewünschte Ausgabe. Dies wird erreicht, indem Sie einfach nach aa oder bb suchen. Es werden keine Quantoren ( + oder * ) benötigt. Mach es einfach so, wie es in der Antwort von Inbar Rose steht:

%Vor%     
ovgolovin 21.10.2012 16:12
quelle
0

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%     
Dileep Nandanam 21.10.2012 16:35
quelle
-1

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

    
volcano 21.10.2012 15:58
quelle

Tags und Links