Python und Regex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
serial
User
Beiträge: 3
Registriert: Dienstag 1. April 2014, 08:53

Hallo zusammen,
ich bin in dieser spannenden Welt ein Neuling und wollte was fragen:
Ich habe einen String:
AAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA
BB1
AAAAAAAAAAAAAAAAAA
BB2
AAAAAAAAAAAAAAAAAA
Wenn ich als Regex: BB1.*AA (mit Dot matches all) eingebe, dann habe ich das hier als Match:
BB1
AAAAAAAAAAAAAAAAAA
BB2
AAAAAAAAAAAAAAAAAA
Ich will aber nach BB1.*AA ohne dass es dazwischen noch ein BB steht suchen. Also quasi:
BB1
AAAAAAAAAAAAAAAAAA
Und wie kann ich das am effektifsten in Python implementieren.
Ich wäre über jeden Tipp dankbar.

Danke im Voraus.

Python 2.7

Gruß,
Serial.
BlackJack

@serial: Reguläre Ausdrücke sind normalerweise ”gierig” und versuchen so viel wie möglich zu treffen, darum erwischt '.*' alles bis zu den letzten beiden 'A'. Nicht-”gierig” bekommt man einen Teilausdruck mit dem '?', also 'BB1.*?AA'. Da gibt es nun aber das Problem das nicht mehr alle 'A' bis zum 'BB2' getroffen werden, sondern nur die ersten beiden. Stehen ja auch nur zwei dort. Das kann man in dem Beispiel dadurch beheben, dass man statt „zwei A” sagt man möchte „mindestens zwei A”: 'BB1.*?A{2,}'.

Ich habe aber den Verdacht das es im Original nicht einfach nur um 'A's geht, und das reguläre Ausdrücke (alleine) hier vielleicht nicht die beste Antwort sind.
serial
User
Beiträge: 3
Registriert: Dienstag 1. April 2014, 08:53

BlackJack hat geschrieben:@serial: Reguläre Ausdrücke sind normalerweise ”gierig” und versuchen so viel wie möglich zu treffen, darum erwischt '.*' alles bis zu den letzten beiden 'A'. Nicht-”gierig” bekommt man einen Teilausdruck mit dem '?', also 'BB1.*?AA'. Da gibt es nun aber das Problem das nicht mehr alle 'A' bis zum 'BB2' getroffen werden, sondern nur die ersten beiden. Stehen ja auch nur zwei dort. Das kann man in dem Beispiel dadurch beheben, dass man statt „zwei A” sagt man möchte „mindestens zwei A”: 'BB1.*?A{2,}'.

Ich habe aber den Verdacht das es im Original nicht einfach nur um 'A's geht, und das reguläre Ausdrücke (alleine) hier vielleicht nicht die beste Antwort sind.
Danke für die schnelle Antwort erstmal.
Ja du hast recht, im Original gehts nicht nur um 'A's aber es ist einfacher glaube ich:
* X=10 text
* Y=0 text
* Y=1 text
* Y=13 text
* X=127 text
* X=100 text
* Y=1 text
* X=200 text
* Y=1 text
Ich würde gerne nach: "X=1 bis Y=1" suchen und nur das hier als Ergebnis zurückbekommen:
* X=10 text
* Y=0 text
* Y=1 text
und nicht :
* X=10 text
* Y=0 text
* Y=1 text
* Y=13 text
* X=127 text
* X=100 text
* Y=1 text
serial
User
Beiträge: 3
Registriert: Dienstag 1. April 2014, 08:53

EDIT: Ich glaube ich habs:

X=1.*?Y=1(?=.*X)

Danke für deine Hilfe.
BlackJack

@serial: Mit dem Ausdruck bekommst Du nur:

Code: Alles auswählen

X=10 text
* Y=0 text
* Y=1
Also ohne den ersten '* ' und ohne den 'text' in der letzten getroffenen Zeile. Und der '(?=.*X)'-Teil bewirkt dabei nichts. Jedenfalls nicht bei der Beispieleingabe.

Das neue Eingabebeispiel bestärkt mich in der Vermutung, das reguläre Ausdrücke alleine nicht die Lösung sind, die ich anstreben würde, sondern Python-Code der auf Zeilenebene mit den Daten arbeitet, denn die scheinen ja zeilenweise organisiert zu sein.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@serial: Such dir am besten ein Programm in dem du die Ausdrücke schnell testen kannst. Z.B. http://regexpal.com/ oder Notepad++
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Boa: was gibt es schnelleres, als die regulären Ausdrücke direkt mit Python zu testen?
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@Sirius3: *Wegrenn* bevor mich die Fangfrage fängt :mrgreen:
BlackJack

@Sirius3: Na ein Programm zum Testen von Regexen. Wo man Änderungen gleich sieht wenn man Ausdruck oder Text ändert, wo die Treffer farbig hervorgehoben werden (am besten nach Gruppen eingefärbt), wo man alle Treffer und Gruppen automatisch in Tabellenform angezeigt bekommt.
fheck
User
Beiträge: 1
Registriert: Dienstag 8. April 2014, 15:55

IDEs wie PyCharm haben solche Regex-Test-Funktionen auch integriert :)

LG
Antworten