2016-04-08 10 views
0

Versuchen, nur Wörter zu lesen, die alphabetischen Inhalt aus einer Datei enthalten und in eine Liste einfügen.Sonderzeichen in Datei lesen ignorieren

def readWords(x,y): 
    with open(x,'r') as f: 
     for line in f: 
      for word in line.split(): 
       y.append(word) 

firstFile = sys.argv[1] 
firstList = [] 
readWords(firstFile, firstList) 

Beispieldatei:

car */ /*one lemon grass 
food accelerate 

Wie modifiziere ich das jedes Wort außer Sonderzeichen lesen in (nur alphabetisch Inhalt, keine Satzzeichen oder Ziffern)? dh das Endergebnis infrage kommen:

[car, one, lemon, grass, food, accelerate] 
+1

Regex würde hier am besten. Sie können die Bedingung '\ s' verwenden, um Sonderzeichen zu erfassen. – Adib

+2

@Adib '\ s' erfasst Leerzeichen. –

+0

@Scherf Welche Zeichen sind speziell für dich? –

Antwort

2

einfachste Lösung, die Raumfilter und Sonderzeichen:

filter(None,re.split(r'\W|\d', bleh)) 

Die Regex

Der reguläre Ausdruck '\ W' bedeutet im Grunde, 'fängt' irgendein Nicht-Wort-Zeichen, und \ d bedeutet, dass Sie Zahlenzeichen fangen wollen. Also, wenn Sie ein Wort wie:

Banane "* # 12312 Zucker

Es wird die komplette Nicht-Wort-Zeichen fangen:

" * # 12312

Die Regex-Funktion Split

Dieser Code:

re.split(r'\W|\d', bleh) 

ist ähnlich zu spalten, dass Sie verwendet, außer es ist cool, weil es regex-driven ist, die Sie einige erstaunliche Fähigkeiten gibt.

Filterfunktion

filtert Buchstäblich die Liste aus dem, was Sie nicht wollen. Also, in diesem Code, wo foo eine Liste, wo foo = [ "A", "B", "", "D"]:

filter(None,foo) 

Es besteht im Wesentlichen in der Liste sieht und finden Sie Instanzen von ' None ', und pop/entfernen Sie es aus der Liste.

Voll Code:

import re 
bleh = """"car */12314 34234 /*one 123123lemon grass 
food accelerate 
""" 
print filter(None,re.split(r'\W|\d', bleh)) 

Ergebnis:

['car', 'one', 'lemon', 'grass', 'food', 'accelerate'] 

mit Ihrem Code

import re 
def readWords(x,y): 
    with open(x,'r') as f: 
     for line in f: 
      //Append to y 
      y += filter(None,re.split(r'\W|\d', line)) 

firstFile = sys.argv[1] 
firstList = [] 
readWords(firstFile, firstList) 
+1

Ich würde auf '\ W +' teilen, um die Anzahl der Übereinstimmungen zu reduzieren – user3159253

+0

@ user3159253 Gute Empfehlung! – Adib

+1

Dies scheint jedes Wort in einer eigenen Liste enthalten? Auch das Testen einer anderen Datei verhindert nicht, dass Ziffern gelesen werden. Ergebnisse erhalten wie ['21333'] – Scherf