Regex fügt dem übereinstimmenden String ein Zeichen hinzu

8

Ich habe eine lange Zeichenfolge, die ein Absatz ist, aber nach Perioden gibt es keinen Leerraum. Zum Beispiel:

%Vor%

Ich versuche re, um dieses Problem zu lösen, aber die Ausgabe ist nicht das, was ich erwartet habe.

Das habe ich gemacht:

%Vor%

Ich passe das erste Zeichen jedes Satzes an, und ich möchte ein weißes Leerzeichen davor setzen. Mein Übereinstimmungsmuster ist (?<=\.). , das (angeblich) nach einem Zeichen sucht, das nach einem Punkt angezeigt wird. Ich habe aus anderen stackoverflow-Fragen gelernt, dass \ 1 mit dem letzten übereinstimmenden Muster übereinstimmt, also schrieb ich mein Ersetzungsmuster als , ein Leerzeichen, gefolgt von der zuvor übereinstimmenden Zeichenfolge.

Hier ist die Ausgabe:

%Vor%

Anstatt ein beliebiges Zeichen vor einem Punkt zu finden und davor ein Leerzeichen einzufügen, ersetzt re.sub das übereinstimmende Zeichen durch \x01 . Warum? Wie füge ich ein Zeichen vor einer übereinstimmenden Zeichenfolge hinzu?

    
versatile parsley 11.03.2017, 06:07
quelle

5 Antworten

8

Der (?<=a)b ist ein positiver Lookbehind . Es entspricht b nach a . Der a wird nicht erfasst. In deinem Ausdruck bin ich mir nicht sicher, was der Wert von in diesem Fall darstellt, aber es ist nicht das, was in (?<=...) enthalten ist.

Ihr derzeitiger Ansatz hat noch einen weiteren Nachteil: Er würde nach einem . ein Leerzeichen einfügen, selbst wenn eines bereits vorhanden ist.

Um fehlenden Platz nach . hinzuzufügen, empfehle ich eine andere Strategie: Ersetzen Sie . -followed-by-non-space-non-dot durch . und ein Leerzeichen:

%Vor%     
janos 11.03.2017, 06:25
quelle
2

Eine leicht modifizierte Version von regex funktioniert auch:

%Vor%     
Sandipan Dey 11.03.2017 08:53
quelle
2

Sie können vielleicht den folgenden Regex (mit einem positiven Look-behind und <) verwenden a href="http://www.regular-expressions.info/lookaround.html#lookahead"> negative Vorausschau Behauptung) :

%Vor%

python

%Vor%

Siehe Demo

    
m87 11.03.2017 06:14
quelle
1

Ich denke, das ist es, was Sie tun wollen. Sie können eine Funktion übergeben, um die Ersetzung durchzuführen.

%Vor%

Drucke:

%Vor%

Wie @ Seanny123 darauf hingewiesen hat, fügt dies ein Leerzeichen hinzu, selbst wenn nach dem Punkt bereits ein Leerzeichen vorhanden war.

    
Millie Smith 11.03.2017 06:23
quelle
0

Die einfachste Regex-Substitution, die Sie verwenden können, ist diese:

%Vor%

Er passt einfach zu jeder Periode und verwendet den Lookahead, (?=\w) , um sicherzustellen, dass neben dem Punkt ein Wortzeichen und nicht bereits ein Leerzeichen steht, und ersetzt ihn durch .

    
micsthepick 11.03.2017 06:29
quelle

Tags und Links