Podziel ciąg na podstawie wyrażenia regularnego

143

Mam wynik polecenia w formie tabelarycznej. Analizuję te dane wyjściowe z pliku wynikowego i przechowuję je w ciągu. Każdy element w jednym wierszu jest oddzielony jednym lub większą liczbą białych znaków, dlatego używam wyrażeń regularnych, aby dopasować 1 lub więcej spacji i podzielić go. Jednak pomiędzy każdym elementem wstawiana jest spacja:

>>> 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 jest lepszy sposób na zrobienie tego?

Po każdym podziale str2jest dołączany do listy.

user2763554
źródło
1
Odrzuciłem to pytanie. Powodem jest to, że chociaż samo pytanie jest istotne, podany przykład nie jest wystarczająco trudny, aby naprawdę wymagać żądanego rozwiązania. Wyrażenie regularne byłoby wymagane, jeśli masz na przykład bloki słów, bloki liczb i chcesz podzielić je na różne zmienne.
erikbwork
@erikbwork Chciałem usunąć niechciany element spacji w wynikowym ciągu'str2'
user2763554
1
Tak i możesz to osiągnąć po prostu używając str1.split(). Nie ma potrzeby stosowania wyrażenia regularnego.
erikbwork

Odpowiedzi:

176

Używając (, )przechwytujesz grupę, jeśli po prostu je usuniesz, nie będziesz miał tego problemu.

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

Jednak nie ma potrzeby stosowania wyrażenia regularnego, str.splitbez określonego separatora podzieli to za Ciebie spacjami. W tym przypadku byłby to najlepszy sposób.

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

Jeśli naprawdę chciałeś wyrażenia regularnego, możesz użyć tego ( '\s'reprezentuje białe znaki i jest jaśniejsze):

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

lub możesz znaleźć wszystkie znaki inne niż białe znaki

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']
jamylak
źródło
4
Nie komplikuj. str.splitjest zdecydowanie najlepszy: D
jamylak
Jak mogę tego użyć, jeśli mam ciąg, który zaczyna się i kończy na spację. przykład: „abc de”. W tym przypadku wynik jest następujący['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish
@RakholiyaJenishstr1.split()
jamylak
@jamylak string.split()jest opcją. Pytałem, czy można to zrobić również za pomocą regex?
Rakholiya Jenish
2
@RakholiyaJenish Czy nie możesz użyć re.findallopcji?
jamylak
24

str.splitMetoda automatycznie usunie wszystkie spacje między elementami:

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

Dokumenty są tutaj: http://docs.python.org/library/stdtypes.html#str.split

Trevor
źródło
1
@ GururajY.S .: str.split()to prawdopodobnie najlepszy wybór do czegoś tak lekkiego jak to.
Joel Cornett
7

Gdy używasz, re.splita wzór podziału zawiera grupy przechwytywania, grupy te są zachowywane w wyniku. Jeśli tego nie chcesz, użyj zamiast tego grupy nieprzechwytywanej.

BrenBarn
źródło
2
Używanie str.splitjest prawdopodobnie lepsze dla twojego przykładu. Chciałem tylko wyjaśnić, dlaczego zachowujesz się tak, jak robisz.
BrenBarn
2

Właściwie jest to bardzo proste. Spróbuj tego:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
cholernie
źródło
2
Chciałbym dać +1, ale używasz brzydkich średników.
jamylak
3
@jamylak Lol. Zmienię je. :) Zwyczaj używania Java i Pythona!
przeklęty
1
@ GururajY.S. Jeśli chcesz podzielić na podstawie miejsca, po prostu użyjstringToSplit.split()
cholerny