2012-06-11 18 views
67

Mam dane wyjściowe polecenia w formie tabelarycznej. Przetwarzam dane wyjściowe z pliku wynikowego i zapisuję je w łańcuchu. Każdy element w jednym wierszu jest oddzielony jednym lub większą liczbą znaków białych znaków, dlatego używam wyrażeń regularnych, aby dopasować 1 lub więcej spacji i podzielić je. Jednak pomiędzy każdym elementem wstawia się spację:Podziel ciąg na podstawie wyrażenia regularnego

>>> str1="a b  c  d" # spaces are irregular 
>>> str1 
'a b  c  d' 
>>> str2=re.split("()+", str1) 
>>> str2 
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!! 

Czy istnieje lepszy sposób na zrobienie tego?

Po każdym podzieleniu str2 jest dołączany do listy.

+0

Zignorowałem to pytanie. Powodem jest to, że chociaż samo pytanie jest istotne, dany przykład nie jest wystarczająco trudny, aby naprawdę wymagać rozwiązania. Wyrażenie regularne będzie wymagane, jeśli masz na przykład bloki słów, bloki liczb i chcesz je rozdzielić na różne zmienne. – erikbwork

+0

@erikbwork Chciałem usunąć niechciany element z przestrzeni w wynikowym ciągu '' str2''' – user2763554

+0

Tak i możesz to osiągnąć używając po prostu 'str1.split()'. Nie ma potrzeby stosowania wyrażeń regularnych. – erikbwork

Odpowiedz

95

Korzystając (, ), przechwytywania grupę, jeśli po prostu usunąć je nie będzie miał tego problemu.

>>> str1 = "a b  c  d" 
>>> re.split(" +", str1) 
['a', 'b', 'c', 'd'] 

Jednak nie ma potrzeby regex, str.split bez ogranicznika określonym podzieli ten spacjami dla Ciebie. To byłby najlepszy sposób w tym przypadku.

>>> str1.split() 
['a', 'b', 'c', 'd'] 

Jeśli naprawdę chciał regex można użyć tego ('\s' reprezentuje spacje i jest jaśniejszy):

>>> re.split("\s+", str1) 
['a', 'b', 'c', 'd'] 

lub można znaleźć wszystkie znaki nie-białych znaków

>>> re.findall(r'\S+',str1) 
['a', 'b', 'c', 'd'] 
+0

Dzięki .... Wszystkie trzy odpowiedzi zadziałały !!! ale który z nich byłby lepszy? – user2763554

+3

Zachowaj to proste. 'str.split' jest zdecydowanie najlepszy: D – jamylak

+0

Jak mogę tego użyć, jeśli mam ciąg, który zaczyna się i kończy z spacją. przykład: "a b c de". W tym przypadku wynik jest następujący: '['', 'a', 'b', 'c', 'de', '']' –

5

Gdy używasz re.split, a wzór podziału zawiera grupy przechwytujące, grupy są zachowywane na wyjściu. Jeśli tego nie chcesz, zamiast tego użyj grupy niezapisującej.

+0

Dzięki .... Wszystkie trzy odpowiedzi zadziałały !!! ale który z nich byłby lepszy? – user2763554

+1

Używanie 'str.split' jest prawdopodobnie lepsze dla twojego przykładu. Chciałem tylko wyjaśnić, dlaczego masz takie zachowanie. – BrenBarn

13

Sposób str.split automatycznie usunie wszystkie spacje pomiędzy pozycjami:

>>> str1 = "a b  c  d" 
>>> str1.split() 
['a', 'b', 'c', 'd'] 

Docs tutaj: http://docs.python.org/library/stdtypes.html#str.split

+0

Dzięki .... Wszystkie trzy odpowiedzi zadziałały !!! ale który z nich byłby lepszy? – user2763554

+0

@ GururajY.S .: 'str.split()' jest prawdopodobnie najlepszym wyborem dla czegoś tak lekkiego, jak ten. –

1

Jego bardzo proste właściwie. Wypróbuj to:

str1="a b  c  d" 
splitStr1 = str1.split() 
print splitStr1 
+1

Chciałbym to dać +1, ale używasz brzydkich średników. – jamylak

+3

@jamylak Lol. Zmienię je. :) Przyzwyczajenie używania java i Pythona! – damned

+0

Dzięki .... Wszystkie trzy odpowiedzi zadziałały !!! ale który z nich byłby lepszy? – user2763554

Powiązane problemy