Der effizienteste Weg, um überflüssige Zeilenumbrüche in Python zu löschen

8

Ich möchte herausfinden, wie man mit Python überflüssige Zeilenumbrüche im Text, wie man sie von Project Gutenberg erhält, entfernt, wo ihre Textdateien alle 70 Zeichen mit Zeilenumbrüchen formatiert sind. In Tcl könnte ich eine einfache string map machen, so:

%Vor%

Dies würde Absätze getrennt durch zwei Zeilenumbrüche (oder eine neue Zeile und eine Registerkarte) getrennt halten, aber die Zeilen, die mit einer einzigen Zeilenumbrüche enden (die ein Leerzeichen ersetzen), zusammenfassen und überflüssige CRs fallen lassen. Da Python nicht string map hat, war ich noch nicht in der Lage, den effizientesten Weg zu finden, alle unnötigen Zeilenumbrüche zu löschen, obwohl ich mir ziemlich sicher bin, dass es nicht ist, nur zu suchen jede neue Zeile in der Reihenfolge und ersetzen Sie sie durch ein Leerzeichen. Ich könnte einfach den Tcl-Ausdruck in Python auswerten, wenn alles andere fehlschlägt, aber ich würde gerne den besten pythonischen Weg finden, um dasselbe zu tun. Kann mir hier ein Python-Kenner helfen?

    
McClamrock 26.03.2016, 23:21
quelle

3 Antworten

2

Das nächste Äquivalent zum tcl string map wäre str.translate , aber leider kann es nur einzelne Charaktere zuordnen. Es wäre also notwendig, eine Regexp zu verwenden, um ein ähnlich kompaktes Beispiel zu erhalten. Dies kann mit Look-Behind / Look-Ahead-Assertions erfolgen, aber die \r müssen zuerst ersetzt werden:

%Vor%

Ausgabe:

%Vor%

Ich bezweifle jedoch, dass dies genauso effizient ist wie der tcl-Code.

AKTUALISIEREN :

Ich habe einen kleinen Test mit diesem Projekt Gutenberg EBook of War and Peace gemacht UTF-8, 3,1 MB). Hier ist mein tcl-Skript:

%Vor%

und mein Python-Äquivalent:

%Vor%

Grober Leistungstest:

%Vor%

Wie erwartet, ist die tcl-Version also effizienter. Die Ausgabe der Python-Version scheint jedoch etwas sauberer zu sein (keine zusätzlichen Leerzeichen am Zeilenanfang).

    
ekhumoro 27.03.2016, 00:32
quelle
2

Sie können einen regulären Ausdruck mit einer Look-Ahead-Suche verwenden:

%Vor%

Dadurch wird jede neue Zeile ersetzt, auf die kein Zeilenvorschub oder ein Tab mit einem Leerzeichen folgt.

    
zondo 26.03.2016 23:28
quelle
2

Ich verwende das folgende Skript, wenn ich dies tun möchte:

%Vor%
  • Eine "leere" Zeile mit nur einem Zeilenvorschub wird zu zwei Zeilenvorschüben (um den aus der vorherigen Zeile entfernten zu ersetzen). Dies behandelt Dateien, die Absätze mit zwei Zeilenvorschüben trennen.
  • Eine Zeile, die mit einem Tab beginnt, erhält einen führenden Zeilenvorschub (um den aus der vorherigen Zeile entfernten zu ersetzen) und erhält den abschließenden Zeilenvorschub durch ein Leerzeichen ersetzt. Dies behandelt Dateien, die Absätze mit einem Tab-Zeichen trennen.
  • Eine Zeile, die weder leer ist noch mit einem Tab beginnt, erhält ihren Zeilenvorschub durch ein Leerzeichen.
  • Die letzte Zeile in der Datei darf keinen abschließenden Zeilenvorschub haben und wird daher direkt kopiert.
TigerhawkT3 26.03.2016 23:51
quelle

Tags und Links