2017-11-15 16 views
5

Sagen wir, ich habe eine Datei input.txt dass genannt wie folgt aussiehtentfernen ungemischten Zahlen aus Datei

I listened to 4 u2 albums today 
meet me at 5 
squad 4ever 

ich die Zahlen herausfiltern möchten, die auf ihre eigenen sind, so „4“ und „5“ sollte gehen aber "u2" und "4ever" sollten gleich bleiben. dh die Ausgabe sollte

I listened to u2 albums today 
meet me at 
squad 4ever 

Ich habe diesen Code

for line in fileinput.input("input.txt", inplace=True): 
    new_s = "" 
    for word in line.split(' '): 
     if not all(char.isdigit() for char in word): 
      new_s += word 
      new_s += ' ' 
    print(new_s, end='') 

zu verwenden versucht, die ziemlich ähnlich ist der Code, den ich hier gefunden: Removing numbers mixed with letters from string

Aber statt des gewünschten Ausgangs Ich bekomme

I listened to u2 albums today 
meet me at 5 
squad 4ever 

Wie Sie sehen können, gibt es zwei Probleme hier, zuerst nur die Die erste Zeile verliert die Ziffer, die ich verlieren möchte, "5" ist immer noch in der zweiten Zeile vorhanden. Das zweite Problem ist der zusätzliche Leerraum am Anfang einer neuen Zeile.

Ich habe eine Weile mit dem Code herumgespielt und stapeln overflow, kann aber nicht herausfinden, wo das Problem herkommt. Irgendwelche Einsichten?

+0

Das Problem ist, dass das letzte Wort in der Zeile mit '\ n' endet. Dies ist keine Ziffer, also übergibt es die if-Anweisung, und der zusätzliche Platz ist, weil Sie jedes Mal ein Leerzeichen in der for-Schleife hinzufügen, einschließlich für das letzte Wort in der Zeile. – yinnonsanders

Antwort

3

str.split(' ') entfernt nicht die abschließenden Zeilenumbrüche aus jeder Zeile. Sie enden am letzten Wort der Zeile. Also für Ihr erstes Problem, die '5' wird nicht entfernt, weil es tatsächlich '5\n' ist, und die \n ist keine Ziffer.

Das zweite Problem ist verwandt. Wenn Sie das letzte Wort jeder Zeile drucken, enthält es diesen Zeilenumbruch, und Sie fügen am Ende ein Leerzeichen hinzu. Dieser Raum erscheint als das erste Zeichen der nächsten Zeile. Die einfachste Lösung ist einfach, line.split(' ') zu line.split() zu ändern. Ohne Argumente entfernt split() alle Leerzeichen einschließlich der Zeilenumbrüche. Sie müssen auch die end='' von Ihrem print entfernen, so dass die Zeilenumbrüche wieder hinzugefügt werden.

+1

Es gibt auch einen zusätzlichen Platz am Ende jeder Zeile (vor der neuen Zeile), die behandelt werden sollte, möglicherweise durch Verwendung von 'print (new_s [: - 1])' – yinnonsanders

+1

@yinnonsanders Oder durch Speichern die Wörter für jede Zeile in einer Liste und machen ein ''' .join()'. – glibdud

1

Verwenden Sie einfach regexp.

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

Spiel jede Ziffer zwischen Wortgrenzen

oder doppelte Leerzeichen zu vermeiden:

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

Diese Art von Arbeiten, aber es hinterlässt einen weißen Platz anstelle von nichts, wenn eine Zahl, die "Ich hörte heute 4 u2 Alben" in "Ich hörte heute u2 Alben" mit 2 Leerzeichen zwischen "zu" und " u2 ". Irgendeine Möglichkeit, das zu beheben? – Skum

+0

Bearbeitet mit einer Lösung – fievel

0

Sie verwenden regex können:

data = open('file.txt').read() 
import re 
data = re.sub('(?<=\s)\d+(?=$)|(?<=^)\d+(?<=\s)|(\s\d+\s)', '', data) 

Ausgang:

I listened tou2 albums today 
meet me at 
squad 4ever 
Verwandte Themen