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.


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

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


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.