2016-01-26 18 views
5

Mam ciąg tekstu, który wygląda tak:re.split ze spacjami w python

'      19,301   14,856  18,554' 

Gdzie jest przestrzeń.

Próbuję podzielić go na biały obszar, ale muszę zachować całą białą przestrzeń jako element na nowej liście. Tak:

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

Używam następujący kod:

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

i powraca:

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

zauważyć, że zawsze dodaje pusty element na początku mojego lista. Łatwo to upuścić, ale naprawdę chcę zrozumieć, co się tutaj dzieje, więc mogę uzyskać kod, który będzie konsekwentnie traktować rzeczy. Dzięki.

+0

pokazu pożądane wyjście – tinySandy

+2

IMHO, wykorzystując '\ s' czyni go mniej ** ** jasne i po prostu denerwujące, jeśli ktoś chciałby, aby rzeczywiste Spróbuj tego. –

+0

@StefanPochmann zgodził się. trudniej jest sobie z tym poradzić –

Odpowiedz

4

Podczas korzystania z re.split metoda, jeśli grupa przechwytująca jest dopasowana na początku ciągu, "result will start with an empty string". Powodem tego jest, że metoda join może zachowywać się jako odwrotność metody split.

To może nie mieć większego sensu w twoim przypadku, w którym separatory pasują do różnych rozmiarów, ale jeśli myślisz o przypadku, w którym separatory były znakiem |, a Ty chciałeś dołączyć do nich, z dodatkowy pusty łańcuch będzie działać:

>> 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' 

Ale bez niego, wstępna rura będzie brakowało:

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

Można to zrobić z re.findall():

>>> 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'] 

Mówiłeś „przestrzeń” w pytaniu, więc wzór pracuje z przestrzenią. Dopasowywania przebiegów dowolnego spacją można użyć:

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

Wzór pasuje jedno lub więcej białych znaków lub jeden lub więcej niż biały znak, na przykład:

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