2009-05-03 6 views
13

Ich versuche, alle Ziffern aus einer Zeichenfolge zu löschen. Der nächste Code löscht aber auch die in jedem Wort enthaltenen Ziffern, und das will ich natürlich nicht. Ich habe viele reguläre Ausdrücke ohne Erfolg versucht.Löschen von Ziffern in Python (Regex)

Danke!


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

Ergebnis:

Diese nicht deletd b müssen, aber die Zahl am Ende ja

Antwort

18

einen Raum hinzufügen, bevor die \ 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 ' 

Bearbeiten: Nach dem Blick auf die Kommentare, beschloss ich, eine vollständigere Antwort zu bilden. Ich denke, dass dies für alle Fälle gilt.

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

Oh, danke, es hat funktioniert! – Menda

+1

Was ist mit Saiten wie "3at"? – marcog

+0

Hier sind weitere 2 Fälle für Ihre Komponententests: "123 sollte gelöscht werden." und 'Du wurdest 0wn3d' –

2

Wenn Ihre Zahl ist immer am Ende der Saiten versuchen: re.sub ("\ d + $", "", s)

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

Sie können die Rückverweise so anpassen, dass nur ein oder zwei Leerzeichen (\ s mit einem weißen Trennzeichen übereinstimmen) beibehalten werden.

+0

\ W ist wahrscheinlich besser als \ s dafür. Auch eine bessere Variante wäre "\ b \ d + \ b", außer dass es für mich nicht funktioniert! – dwc

12

Versuchen Sie Folgendes:

"\b\d+\b" 

Das stimmt nur mit den Ziffern überein, die nicht Teil eines anderen Wortes sind.

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

Dies löscht nicht die erste oder letzte Nummer für, s = s = "1234 Dies muss nicht b3 delet3d, 123 aber die Nummer am Ende ja 134411" – oneporter

+0

Ich habe es gerade mit Ihrer Zeichenfolge getestet und ich habe das erwartete Ergebnis. \ b entspricht entweder dem Anfang der Zeichenfolge, dem Ende oder irgendetwas, das kein Wortzeichen ist ([A-Za-z0-9_]). Ich habe es in IronPython getestet, weiß aber nicht, ob etwas mit Pythons Umgang mit Wortgrenzen nicht stimmt – jrcalzada

+0

Ich habe das nicht versucht, aber könntest du so etwas wie: [^ \ b] \ d + [$ \ b] –

2

Um Ziffernfolgen am Anfang einer Zeile als auch handhaben. 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) 

Die versucht führende/nachfolgende Leerzeichen zu entfernen, wenn es Ziffern am Anfang/Ende der Zeichenfolge. Ich sage "Versuche", denn wenn am Ende mehrere Zahlen vorhanden sind, haben Sie immer noch Leerzeichen.

5

Mit \s ist nicht sehr gut, da es Tabs nicht verarbeitet, et al:

1

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() indem, tritt sie dann wieder zusammen.Mehr verbosely (keine Liste Verständnis verwenden):

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

" ".join(non_digits) 
1

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

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

die oben auch Dinge wie handhaben sollte

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

Dies ist jedoch immer noch unvollständig - Sie benötigen wahrscheinlich eine vollständigere Definition dessen, was Sie in den zu analysierenden Dateien erwarten können.

Edit: es ist auch erwähnenswert, dass '\ b' ändert sich je nach dem Gebietsschema/Zeichensatz, den Sie verwenden, so dass Sie ein wenig vorsichtig damit sein müssen.

0
>>>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“

Dies wird das Numericals am Ende des Strings entfernen.