Wie kann ich das erste Vorkommen eines Zeichens in jedem Wort ersetzen?
Angenommen, ich habe diese Zeichenfolge:
hello @jon i am @@here or @@@there and want some@thing in '@here"
# ^ ^^ ^^^ ^ ^
Und ich möchte das erste @
bei jedem Wort entfernen , damit ich am Ende eine letzte Zeichenfolge wie diese habe:
hello jon i am @here or @@there and want something in 'here
# ^ ^ ^^ ^ ^
Nur zur Verdeutlichung werden "@" -Zeichen in jedem Wort immer zusammen angezeigt, können sich jedoch am Wortanfang oder zwischen anderen Zeichen befinden.
Ich habe es geschafft, das "@" -Zeichen zu entfernen, wenn es nur einmal vorkommt, indem ich eine Variation des regulären Ausdrucks verwendet habe, den ich in " Teilzeichenfolge löschen" gefunden habe, wenn es einmal vorkommt, aber nicht, wenn es in Python zweimal hintereinander vorkommt , wobei ein negativer Lookahead und ein negativer Lookbehind verwendet werden:
@(?!@)(?<!@@)
Siehe die Ausgabe:
>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub(r'@(?!@)(?<!@@)', '', s)
"hello jon i am @@here or @@@there and want something in 'here"
Der nächste Schritt besteht also darin, das "@" zu ersetzen, wenn es mehr als einmal auftritt. Dies ist einfach, indem Sie s.replace('@@', '@')
das "@" von der Stelle entfernen, an der es erneut auftritt.
Ich frage mich jedoch: Gibt es eine Möglichkeit, diesen Ersatz auf einmal durchzuführen?
@Hello@There
Wo@
wäre nicht aufeinanderfolgend?Antworten:
Ich würde einen Regex-Ersatz nach folgendem Muster durchführen:
Und dann ersetzen Sie einfach durch die erste Erfassungsgruppe, die alle fortlaufenden @ -Symbole minus eins enthält.
Dies sollte jedes
@
am Anfang jedes Wortes vorkommende Wort erfassen , sei es das Wort am Anfang, in der Mitte oder am Ende der Zeichenfolge.Dies druckt:
quelle
Wie wäre es mit der Verwendung
replace('@', '', 1)
in einem Generatorausdruck?Der int-Wert von
1
ist das optionalecount
Argument.str.replace(old, new[, count])
quelle
replace(search, replace, max_matches)
, ersetzt er nur den ersten bei jedem Wort.count
, ich habe die Beschreibung aus den Dokumenten hinzugefügt.Sie können
re.sub
wie folgt verwenden:Das führt zu:
Und hier ist ein Proof of Concept:
quelle
Ich habe über Fälle nachgedacht, was passiert, wenn nur das letzte Zeichen vorhanden ist
@
und Sie es nicht entfernen möchten oder wenn Sie bestimmte zulässige Startzeichen haben:Oder nehmen wir an, Sie möchten
@
nur ersetzen , wenn es sich um die ersten n Zeichen handeltquelle
DEMO
Sie können dies versuchen. Siehe Demo.
quelle
Ausgabe:
quelle