División de cadena basada en una expresión regular

143

Tengo la salida de un comando en forma de tabla. Estoy analizando esta salida de un archivo de resultados y la guardo en una cadena. Cada elemento en una fila está separado por uno o más caracteres de espacio en blanco, por lo tanto, estoy usando expresiones regulares para unir 1 o más espacios y dividirlo. Sin embargo, se inserta un espacio entre cada 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!!!

¿Hay una mejor manera de hacer esto?

Después de cada división str2se agrega a una lista.

usuario2763554
fuente
1
Desestimé esta pregunta. La razón es que, si bien la pregunta en sí es relevante, el ejemplo dado no es lo suficientemente difícil como para requerir realmente la solución solicitada. Se requeriría una expresión regular si tiene, por ejemplo, bloques de palabras, bloques de números y desea separarlos en diferentes variables.
erikbwork 03/0318
@erikbwork Quería eliminar el elemento de espacio no deseado en la cadena resultante'str2'
user2763554
1
Sí, y puedes lograrlo simplemente usando str1.split(). No hay necesidad de una expresión regular.
erikbwork

Respuestas:

176

Al usar (, )está capturando el grupo, si simplemente los elimina, no tendrá este problema.

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

Sin embargo, no hay necesidad de expresiones regulares, str.splitsin ningún delimitador especificado se dividirá esto por espacios en blanco para usted. Esta sería la mejor manera en este caso.

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

Si realmente quería expresiones regulares, puede usar esto ( '\s'representa espacios en blanco y es más claro):

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

o puedes encontrar todos los caracteres que no sean espacios en blanco

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']
jamylak
fuente
44
Mantenlo simple. str.splites definitivamente el mejor: D
jamylak
¿Cómo puedo usar esto si tengo una cadena que comienza y termina con espacio? ejemplo: 'abc de'. Para esto, la salida se presenta como['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish
@RakholiyaJenishstr1.split()
jamylak
@jamylak string.split()es una opción. ¿Estaba preguntando si se podría hacer con regex también?
Rakholiya Jenish
2
@RakholiyaJenish ¿No puedes usar la re.findallopción?
jamylak
24

El str.splitmétodo eliminará automáticamente todo el espacio en blanco entre los elementos:

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

Los documentos están aquí: http://docs.python.org/library/stdtypes.html#str.split

Trevor
fuente
1
@ GururajY.S .: str.split()es probablemente la mejor opción para algo tan liviano como esto.
Joel Cornett
7

Cuando utiliza re.splity el patrón dividido contiene grupos de captura, los grupos se retienen en la salida. Si no quiere esto, use un grupo que no sea de captura en su lugar.

BrenBarn
fuente
2
Usar str.splites probablemente mejor para su ejemplo. Solo quería explicar por qué obtienes el comportamiento que haces.
BrenBarn
2

Es muy simple en realidad. Prueba esto:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
maldito
fuente
2
Haría +1 en esto, pero estás usando un punto y coma feo.
jamylak
3
@jamylak Lol. Los cambiaré :) Hábito de usar Java y Python!
condenado el
1
@ GururajY.S. Si solo desea dividir en función del espacio, simplemente debe usarstringToSplit.split()
maldito