2017-02-19 3 views
2

Als Folge zu this question, habe ich einen Ausdruck wie folgt: , die mit re.findall('\w+|\W+',item) Methode erstellt wurde, jedoch innerhalb dieser Liste von Strings gibt es zwei Fehler. Eins ist das '+' (und das andere ist das ')).Python - Split-Liste korrekt extrahieren

Gibt es einen pythonischen Weg, dass ich nur die Operatoren teilen könnte, so dass die Liste so etwas wie ['(', '44', '+','(', '3', '+', 'll', ')',')'] wäre.

(halten Sie die Ziffern/Buchstaben zusammen, trennen Sie die Symbole)

Dank

+0

es ist _not_ ein Duplikat wie _at all_. Es mag so aussehen, aber ich habe die Frage bearbeitet, um wirklich zu zeigen, was OP will (nachdem ich die Prequel-Frage beantwortet habe) –

+0

überprüfe meine Antwort, sie beantwortet nun beide Fragen. –

Antwort

1

Sie wollen Zeichen von gruppierten nicht-alphanumerischen Zeichen spalten.

Ich würde ein 1-Listenelement erstellen, wenn das Element in Ordnung ist (alphanumerisch) oder eine Liste von Zeichen, wenn das Element eine Folge von Symbolen ist.

Dann würde ich die Liste abflachen zu bekommen, was Sie fragte

import itertools 

l = ['(', '44', '+(', '3', '+', 'll', '))'] 
new_l = list(itertools.chain.from_iterable([x] if x.isalnum() else list(x) for x in l)) 
print(new_l) 

Ergebnis:

['(', '44', '+', '(', '3', '+', 'll', ')', ')'] 

EDIT: eigentlich könnten Sie verknüpfen Ihre 2 Fragen in einer Antwort (Anpassung der regex answer der ursprünglichen Frage), indem Symbole in der Regex nicht gruppiert werden:

import re 
lst = ['z+2-44', '4+55+((z+88))'] 
print([re.findall('\w+|\W', s) for s in lst]) 

(beachten Sie t er Mangel an + nach \W) und Sie erhalten direkt:

[['z', '+', '2', '-', '44'], ['4', '+', '55', '+', '(', '(', 'z', '+', '88', ')', ')']] 
1

Short-Lösung mit str.join() und re.split() Funktionen:

import re 
l = ['(', '44', '+(', '3', '+', 'll', '))'] 
new_list = [i for i in re.split(r'(\d+|[a-z]+|[^\w])', ''.join(l)) if i.strip()] 

print(new_list) 

Der Ausgang:

['(', '44', '+', '(', '3', '+', 'll', ')', ')'] 
1

Eine Alternative zu ändern wäre, die Regex, um die nicht-alphanumerischen Zeichen getrennt zu halten:

import re 
lst = ['z+2-44', '4+(55+z)+88'] 
[re.findall('\w+|\W', s) for s in lst] 

#[['z', '+', '2', '-', '44'], ['4', '+', '(', '55', '+', 'z', ')', '+', '88']] 
1

Try this:

import re 
lst = ['z+2-44', '4+(55+z)+88'] 
[re.findall('\w+|\W', s) for s in lst] 

Kann sein, es anderen hilft.