2016-01-26 15 views
5

Ich habe eine Reihe von Text, der wie folgt aussieht:re.split mit Leerzeichen in Python

'      19,301   14,856  18,554' 

Wo ein Raum ist.

Ich versuche, es auf den Leerraum zu teilen, aber ich muss den ganzen Leerraum als ein Element in der neuen Liste behalten. Wie folgt aus:

['      ', '19,301','  ', '14,856', '  ', '18,554'] 

Ich habe den folgenden Code unter Verwendung von:

re.split(r'(+)(?=[0-9])', item) 

und es gibt:

['', '      ', '19,301', '  ', '14,856', '  ', '18,554'] 

Beachten Sie, dass es immer fügt ein leeres Element zu Beginn meiner Liste. Es ist einfach, es fallen zu lassen, aber ich möchte wirklich verstehen, was hier vor sich geht, damit ich den Code bekomme, um die Dinge konsequent zu behandeln. Vielen Dank.

+0

zeigt Ausgang – tinySandy

+2

imho gewünscht, mit '\ s' es macht ** weniger ** klar und einfach nervig wenn jemand hier wirklich etwas wollte versuche es. –

+0

@StefanPochmann stimmte zu. Das ist schwieriger zu handhaben –

Antwort

4

Wenn die Verwendung von re.split Methode, wenn die Capture-Gruppe am Anfang einer Zeichenfolge übereinstimmt, die "result will start with an empty string". Der Grund dafür ist, dass die Methode join sich wie die umgekehrte Methode split verhalten kann.

Es ist möglicherweise nicht sehr sinnvoll für Ihren Fall, wo die Trennzeichen Übereinstimmungen unterschiedlicher Größe sind, aber wenn Sie an den Fall denken, wo die Trennzeichen ein | Zeichen waren und Sie eine Verknüpfung mit ihnen durchführen wollten das zusätzliche leere Zeichenfolge es funktionieren würde:

>> item = '|19,301|14,856|18,554' 
>> items = re.split(r'\|', item) 
>> print items 
['', '19,301', '14,856', '18,554'] 
>> '|'.join(items) 
'|19,301|14,856|18,554' 

Aber ohne sie würde das Ausgangsrohr fehlt:

>> items = ['19,301', '14,856', '18,554'] 
>> '|'.join(items) 
'19,301|14,856|18,554' 
3

Sie können es mit re.findall() tun:

>>> s = '\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s19,301\s\s\s\s\s\s\s\s\s14,856\s\s\s\s\s\s\s\s18,554'.replace('\\s',' ') 
>>> re.findall(r' +|[^ ]+', s) 
['      ', '19,301', '   ', '14,856', '  ', '18,554'] 

Sie sagen, "Raum" in der Frage, so das Muster arbeitet mit dem Raum. Für Durchläufe von jedem Leerzeichen passende können Sie:

>>> re.findall(r'\s+|\S+', s) 
['      ', '19,301', '   ', '14,856', '  ', '18,554'] 

Das Muster entspricht ein oder mehrere Leerzeichen oder ein oder mehr Nicht-Leerzeichen, zum Beispiel:

>>> s=' \t\t ab\ncd\tef g ' 
>>> re.findall(r'\s+|\S+', s) 
[' \t\t ', 'ab', '\n', 'cd', '\t', 'ef', ' ', 'g', ' '] 
Verwandte Themen