Ersetzen in String basierend auf der Funktion output

8

Also, für die Eingabe:

%Vor%

Ich möchte ausgeben:

%Vor%

Also, im Grunde muss ich alle Wörter der Länge größer oder gleich 4 im folgenden Format abkürzen: first_letter + length_of_all_letters_in_between + last_letter

Ich versuche das zu tun:

%Vor%

Aber es funktioniert nicht. In JS würde ich leicht tun:

%Vor%

Wie mache ich das gleiche in Python?

BEARBEITEN: Ich kann es mir nicht leisten, eine Interpunktion in der ursprünglichen Zeichenfolge zu verlieren.

    
Gaurang Tandon 30.05.2015, 10:19
quelle

7 Antworten

3

Das Problem besteht darin, dass len(r'') immer 2 ist, nicht die Länge der zweiten Erfassungsgruppe in Ihrem regulären Ausdruck. Sie können einen lambda -Ausdruck verwenden, um eine Funktion zu erstellen, die genauso funktioniert wie der Code, den Sie in JavaScript verwenden würden:

%Vor%

Das Argument m für das Lambda ist ein match -Objekt und die Aufrufe seiner Methode group sind äquivalent zu den Rückverweisen, die Sie zuvor verwendet haben.

Es könnte einfacher sein, ein einfaches Wort-Matching-Muster ohne einfangende Gruppen zu verwenden ( group() kann immer noch ohne Argument aufgerufen werden, um den gesamten übereinstimmenden Text zu erhalten):

%Vor%     
Blckknght 30.05.2015, 10:40
quelle
7

Was Sie in JavaScript tun, ist sicherlich richtig, Sie übergeben eine anonyme Funktion. In Python wird ein konstanter Ausdruck übergeben ("\ 12 \ 3", da len(r"") vor dem Funktionsaufruf ausgewertet wird). Dies ist keine Funktion, die für jede Übereinstimmung ausgewertet werden kann!

Während anonyme Funktionen in Python nicht so nützlich sind wie in JS, machen sie die Aufgabe hier:

%Vor%

Was hier passiert, ist, dass das Lambda für jede Substitution aufgerufen wird, indem ein Match-Objekt genommen wird. Ich erhalte dann die benötigten Informationen und erstelle daraus eine Ersatzzeichenfolge.

    
Cu3PO42 30.05.2015 10:35
quelle
2
%Vor%

Wenn Sie nur Buchstaben verwenden wollen, benutzen Sie str.isalpha:

%Vor%

Die Logik ist für beide gleich, es ist genau das, wonach wir suchen. Wenn not ch.isalpha() False ist, haben wir ein Nicht-Alpha-Zeichen gefunden. Daher müssen wir die tmp-Zeichenkette verarbeiten und zu out-Ausgabe hinzufügen. if len(tmp) ist nicht größer als 3 gemäß der Anforderung fügen wir einfach die tmp-Zeichenfolge und das aktuelle Zeichen zu unserer out-Zeichenfolge hinzu.

Wir brauchen ein letztes out += "{}{}{} außerhalb der Schleife, um zu fangen, wenn eine Zeichenfolge nicht in einem Komma, Leerzeichen usw. endet. Wenn die Zeichenfolge in einem Nicht-Alpha enden würde, würden wir eine leere Zeichenfolge hinzufügen kein Unterschied zur Ausgabe.

Es wird Interpunktion und Leerzeichen beibehalten:

%Vor%     
Padraic Cunningham 30.05.2015 10:32
quelle
1

Halte es einfach ...

%Vor%

\B , das zwischen zwei Wortzeichen oder zwei Nichtwortzeichen passt, hilft dabei, alle Zeichen außer dem ersten und letzten Zeichen zu finden.

    
Avinash Raj 30.05.2015 11:43
quelle
1

Alternativ können Sie eine separate Funktion für re.sub verwenden und die einfache Regex r"(\b[a-zA-Z]+\b)" verwenden.

%Vor%

Auch als pythonischer und allgemeiner Weg, um die ersetzten Wörter innerhalb einer Liste zu erhalten, können Sie ein Listenverständnis mit re.finditer :

verwenden %Vor%

Der re.finditer gibt einen Generator zurück, der alle matchobjects , dann können Sie darüber iterieren und erhalten den Anfang und das Ende von matchobject s mit span() Methode.

    
Kasramvd 30.05.2015 10:57
quelle
0

Verwenden von Regex und Verständnis:

%Vor%

Gibt:

%Vor%     
perreal 30.05.2015 10:35
quelle
-1

Sehen Sie sich den folgenden Code an

%Vor%

Das einzige, was Sie beachten sollten, ist Komma und andere Interpunktionszeichen.

    
pythondetective 30.05.2015 10:38
quelle

Tags und Links