Frage

Ich versuche, alle Ziffern aus einer Zeichenfolge zu löschen. Doch der nächste Code löscht auch Ziffern in jedem Wort enthalten ist, und natürlich will ich das nicht. Ich habe ohne Erfolg viele reguläre Ausdrücke versuchen.

Danke!


s = "This must not b3 delet3d, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s

Ergebnis:

  

Das muss nicht b deletd, aber die Zahl am Ende ja

War es hilfreich?

Lösung

Fügen Sie ein Leerzeichen vor dem \ d +.

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '

Edit: Nachdem in den Kommentaren suchen, habe ich beschlossen, eine vollständigere Antwort zu bilden. Ich denke, das macht für alle Fälle.

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)

Andere Tipps

Versuchen Sie folgendes:

"\b\d+\b"

Das wird nur die Ziffern entsprechen, die nicht Teil eines anderen Wortes sind.

\s Verwendung ist nicht sehr gut, da es Tabs nicht behandelt, et al. Ein erster Schnitt an einer besseren Lösung ist:

re.sub(r"\b\d+\b", "", s)

Beachten Sie, dass das Muster eine rohe Zeichenfolge ist, weil \b normalerweise die für Streicher Backspace Flucht ist, und wir wollen, dass die besondere Wortgrenze statt entkommen REGEX. Eine etwas ausgefallenere Version ist:

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s)

Das versucht führende / nachfolgende Leerzeichen zu entfernen, wenn es Ziffern am Anfang / Ende der Zeichenfolge. Ich sage „versucht“, weil, wenn es mehrere Zahlen am Ende sind dann noch einige Räume haben.

Um Ziffernfolgen am Anfang einer Zeile behandelt auch:

s = re.sub(r"(^|\W)\d+", "", s)

Wenn Sie Ihre Nummer Allways am Ende der Saiten, ist zu versuchen: re.sub ( "\ d + $", "", s)

andernfalls können Sie versuchen, re.sub ( "(\ s) \ d + (\ s)", "\ 1 \ 2", s)

Sie können die Rückverweise einzustellen nur eine oder zwei der Räume zu halten (\ s jeden weißen Separator entspricht)

Non-regex Lösung:

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'

Splits von " " und prüft, ob der Chunk eine Zahl str().isdigit() , verbindet sie dann wieder zusammen. Mehr verbosely (keine Liste Verständnis verwendet wird):

words = s.split(" ")
non_digits = []
for word in words:
    if not word.isdigit():
        non_digits.append(word)

" ".join(non_digits)

Ich weiß nicht, was Ihre reale Situation aussieht, aber die meisten Antworten schaut, wie sie nicht negative Zahlen oder Dezimalzahlen verarbeiten,

re.sub(r"(\b|\s+\-?|^\-?)(\d+|\d*\.\d+)\b","")

Die oben sollte auch Dinge behandeln wie,

„Das muss nicht b3 delet3d, aber die Zahl am Ende ja -134,411“

Das ist aber noch nicht abgeschlossen -. Sie wahrscheinlich benötigen, um eine vollständigere Definition dessen, was Sie erwarten können, in den Dateien, die Sie analysieren müssen finden

Edit:. Es ist auch erwähnenswert, dass ‚\ b‘ abhängig Änderungen auf dem locale / Zeichensatz verwenden, so müssen Sie mit, dass ein wenig vorsichtig sein

Sie könnten versuchen, diese

s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s) 

Ergebnis:

'This must not b3 delet3d, but the number at the end yes'

die gleiche Regel gilt auch für

s = "This must not b3 delet3d, 4566 but the number at the end yes 134411" 
re.sub("(\s\d+)","",s) 

Ergebnis:

'This must not b3 delet3d, but the number at the end yes'
>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*$", "", s)
>>>s

„Das muss nicht b3 delet3d, aber die Zahl am Ende ja“

Das wird das Numericals am Ende des Strings entfernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top