Können Sie rückwärts von einem Offset mit einem regulären Python-Ausdruck suchen?

8

Wenn ich eine Zeichenfolge und einen Zeichenoffset innerhalb dieser Zeichenfolge angegeben habe, kann ich rückwärts mit einem regulären Python-Ausdruck suchen?

Das eigentliche Problem, das ich lösen möchte, ist, eine passende Phrase an einem bestimmten Offset innerhalb einer Zeichenkette zu bekommen, aber ich muss die erste Instanz vor dieser Verschiebung finden.

In einer Situation, in der ich eine Regex habe, die ein Symbol lang ist (z. B. eine Wortgrenze), verwende ich eine Lösung, bei der ich die Zeichenfolge umkehre.

%Vor%

Ausgabe: 33

%Vor%

Ausgabe: 25

%Vor%

Ausgabe: 'Frage'

Diese "umgekehrte" Technik funktioniert jedoch nicht, wenn ich einen komplizierteren regulären Ausdruck habe, der mehrere Zeichen beinhalten kann. Zum Beispiel, wenn ich die erste Instanz von "ing" abgleichen wollte, die vor einem angegebenen Offset erscheint:

%Vor%

Ideale Ausgabe: Fütterung

Ich kann wahrscheinlich andere Ansätze verwenden (die Datei in Zeilen aufteilen und rückwärts durch die Zeilen iterieren), aber die Verwendung eines regulären Ausdrucks rückwärts scheint eine konzeptionell einfachere Lösung zu sein.

    
Irwin 20.06.2013, 00:42
quelle

2 Antworten

7

Verwenden Sie positives Lookbehind, um sicherzustellen, dass vor einem Wort mindestens 30 Zeichen stehen:

%Vor%

Für das andere Beispiel könnte ein negativer Lookbehind hilfreich sein:

%Vor%

Das erste Greedy-Objekt passt auf ein beliebiges Zeichen außer Backtracks, bis es 16 Zeichen rückwärts nicht übereinstimmt ( (?<!.{16}) ).

    
perreal 20.06.2013, 00:56
quelle
1

Wir können die Präferenz der python-Regex-Engine für Gier (etwas, nicht wirklich) nutzen und sagen, dass wir so viele Zeichen wie möglich haben wollen, aber nicht mehr als 30, dann ... .

Ein passender Regex kann dann r'^.{0,30}(\b)' sein. Wir wollen den Beginn der ersten Erfassung.

%Vor%     
muhmuhten 20.06.2013 01:41
quelle

Tags und Links