Dividi la stringa in base a un'espressione regolare


143

Ho l'output di un comando in forma tabellare. Sto analizzando questo output da un file di risultati e memorizzandolo in una stringa. Ogni elemento in una riga è separato da uno o più caratteri di spazi bianchi, quindi sto usando espressioni regolari per abbinare 1 o più spazi e dividerlo. Tuttavia, uno spazio viene inserito tra ogni elemento:

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

C'è un modo migliore per farlo?

Dopo ogni divisione str2viene aggiunto a un elenco.


1
Ho votato in negativo questa domanda. Il motivo è che, sebbene la domanda stessa sia pertinente, l'esempio dato non è abbastanza difficile da richiedere davvero la soluzione richiesta. Sarebbe necessaria una regex se ad esempio hai blocchi di parole, blocchi di numeri e vuoi separarli in variabili diverse.
erikbwork

@erikbwork Volevo rimuovere l'elemento di spazio indesiderato nella stringa risultante'str2'
user2763554

1
Sì e puoi ottenerlo semplicemente usando str1.split(). Non c'è bisogno di una regex.
erikbwork

Risposte:


176

Utilizzando (, ), si sta catturando il gruppo, se semplicemente rimuoverli non avrete questo problema.

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

Tuttavia non è necessario regex, str.splitsenza alcun delimitatore specificato lo dividerà per spazi bianchi. Questo sarebbe il modo migliore in questo caso.

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

Se volevi davvero regex puoi usarlo ( '\s'rappresenta gli spazi bianchi ed è più chiaro):

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

oppure puoi trovare tutti i caratteri non bianchi

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

4
Mantienilo semplice. str.splitè sicuramente il migliore: D
jamylak,

Come posso usarlo se ho una stringa che inizia e finisce con withspace. esempio: 'abc de'. Per questo l'output arriva come['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish il

@RakholiyaJenishstr1.split()
jamylak,

@jamylak string.split()è un'opzione. Stavo chiedendo se potesse essere fatto anche con regex?
Rakholiya Jenish,

2
@RakholiyaJenish Non puoi usare l' re.findallopzione?
jamylak,


7

Quando si utilizza re.splite il modello diviso contiene gruppi di acquisizione, i gruppi vengono mantenuti nell'output. Se non lo desideri, utilizza invece un gruppo non di acquisizione.


2
L'uso str.splitè probabilmente migliore per il tuo esempio. Volevo solo spiegare perché hai il comportamento che fai.
BrenBarn,

2

In realtà è molto semplice. Prova questo:

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

2
Lo farei +1 ma stai usando brutti punti e virgola.
jamylak,

3
@jamylak Lol. Li cambierò. :) Abitudine all'utilizzo di java e python!
maledetto

1
@ GururajY.S. Se desideri solo dividere in base allo spazio, dovresti semplicemente usarestringToSplit.split()
maledetto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.