2016-05-04 13 views
0

Ich bin auf der Suche nach einem Regex, mit dem ich bestimmte "\ r \ n" Zeichen entfernen kann (oder nur \ n in Python), wenn die folgende Zeile nicht mit einer Nummer beginntRegex Entfernen bestimmter Zeilenumbrüche (Python)

In Perl habe ich dies erreicht, indem \r\n(?!\d) und Ersetzen durch \1 (um das Zeichen in der folgenden Zeile nicht verloren) ersetzt, aber wenn ich das in Python (\n(?!\d)) versuchen, entfernt es alle \n in meinem Dokument.

+0

Sie haben in Ihrem Muster keine Erfassungsgruppe definiert. Ersetzen durch leere Zeichenfolge. Siehe ['\ r? \ N (?! \ D)' demo] (https://regex101.com/r/xR2fI1/1). Funktionieren [diese Demo] (https://ideone.com/Iw9r8i) so, wie Sie es erwarten? –

+0

Ich habe versucht, durch eine leere Zeichenfolge zu ersetzen, aber das Ergebnis ist, dass fast jedes \ n aus meinem Dokument entfernt wird. Ich habe diese Demo versucht, es sei denn, ich mache etwas falsch, leider ist das Ergebnis sehr ähnlich – user3194301

+1

Bitte fügen Sie die Zeichenfolge, gegen die Sie testen (als Python-Variable) und das erwartete Ergebnis. Ich habe das Gefühl, als ob deine Absicht nicht das ist, was du in der Frage beschrieben hast. Alle Fragen, die sich auf Zeilenumbrüche beziehen, sind fast immer das Ergebnis von Missverständnissen oder Tippfehlern im Code oder sogar der Frage, ob es CR + LF oder nur LF-Zeilenenden gibt. Manchmal, Codierungsprobleme. Daher wäre ein Code, der nicht funktioniert, sehr hilfreich. –

Antwort

1

Aufgrund Ihrer Kommentare bin ich mir ziemlich sicher, dass das Problem darin besteht, dass Sie Ihre Übereinstimmung auf einzelne Zeilen und nicht auf den gesamten Text anwenden. Ein negatives Lookahead mit der Breite Null (das Sie verwenden, mit (?!\d)) wird erfolgreich übereinstimmen, wenn das Newline das letzte Zeichen in der Eingabezeichenfolge ist, was der Fall sein wird, wenn Ihr Code zeilenweise funktioniert. Der Lookahead sagt grundsätzlich "Match, wenn nicht gefolgt von einer Ziffer". Das ist immer wahr, wenn in der Eingabezeichenfolge nichts mehr übrig ist.

Sie können die Regex nicht ändern, um dieses Problem zu beheben. Nichts, was Sie in einer einzelnen Zeile überprüfen, kann Ihnen sagen, was der Inhalt der nächsten Zeile sein wird, also müssen Sie den umgebenden Code irgendwie ändern. Ein Ansatz wäre, den gesamten Text zu lesen und zu transformieren, anstatt nur eine Zeile auf einmal. Oder Sie könnten etwas wie the pairwise recipe from itertools verwenden, um zwei Zeilen gleichzeitig zu untersuchen, und die zweite Zeile untersuchen, um zu entscheiden, ob Sie die erste Zeile transformieren müssen.

Ich möchte auch darauf hinweisen, dass das Ersetzen durch \1 nicht geeignet ist, da Sie keine einfangende Gruppe haben (die Klammern in Ihrem Muster sind Teil der Null-Breite Lookahead-Syntax, keine Gruppierungssyntax). Sie sollten nur durch eine leere Zeichenfolge ersetzt werden (was tatsächlich ist, was Sie tun, da die Rückreferenz nichts betrifft).

+0

Sie haben Recht, das wichtigste Problem ist das. Ich analysiere nur eine Zeile nach der anderen, analysiere den Dateiinhalt jedoch als Gruppe. Ich werde Ihren Vorschlag über die Verwendung von paarweise von itertools versuchen. – user3194301

Verwandte Themen