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:
Wie mache ich das gleiche in Python?
BEARBEITEN: Ich kann es mir nicht leisten, eine Interpunktion in der ursprünglichen Zeichenfolge zu verlieren.
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:
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):
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.
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%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.
Alternativ können Sie eine separate Funktion für re.sub
verwenden und die einfache Regex r"(\b[a-zA-Z]+\b)"
verwenden.
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
:
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.
Sehen Sie sich den folgenden Code an
%Vor%Das einzige, was Sie beachten sollten, ist Komma und andere Interpunktionszeichen.