La lista de resultados contiene espacios simples cuando se divide una cadena con re.split(“( )+”). ¿Hay alguna forma mejor?

4 minutos de lectura

avatar de usuario de gjois
gjois

Tengo la salida de un comando en forma tabular. Estoy analizando esta salida de un archivo de resultados y almacenándola en una cadena. Cada elemento en una fila está separado por uno o más caracteres de espacio en blanco, por lo que estoy usando expresiones regulares para hacer coincidir 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 str2 se adjunta a una lista.

  • Rechacé 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.

    – erikbstack

    3 de marzo de 2018 a las 10:42

  • @erikbwork Quería eliminar el elemento de espacio no deseado en la cadena resultante 'str2'

    – gjois

    4 de marzo de 2018 a las 14:20

  • Sí, y puedes lograrlo simplemente usando str1.split(). No hay necesidad de una expresión regular.

    – erikbstack

    04/03/2018 a las 20:44


  • ¿Responde esto a tu pregunta? Dividir cadenas en palabras con múltiples delimitadores de límites de palabras

    – usuario

    28 de diciembre de 2021 a las 1:30

  • Felicitaciones a @erikbstack por explicar un voto negativo. El título y el cuerpo no van juntos. O bien el título debe ser sobre la inclusión de delimitadores en la salida de re.split(), o el cuerpo debe reflejar el título más simple, p. ej. ['1', '2', '3'] == re.split(r'[, ]+', "1,2 3")

    –Bob Stein

    20 de febrero a las 17:02

avatar de usuario de jamylak
jamilak

Mediante el uso (,)estás capturando al grupo, si simplemente los eliminas no tendrás este problema.

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

Sin embargo, no hay necesidad de expresiones regulares, str.split sin ningún delimitador especificado 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 puede encontrar todos los caracteres que no sean espacios en blanco

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

  • Mantenlo simple. str.split definitivamente es el mejor 😀

    – Jamylak

    11 de junio de 2012 a las 6:07

  • ¿Cómo puedo usar esto si tengo una cadena que comienza y termina con espacio? ejemplo: ‘abc de’. Para esto, la salida viene como ['', 'a', 'b', 'c', 'de', '']

    – Rakholiya Jenish

    19 de junio de 2015 a las 8:24

  • @RakholiyaJenish str1.split()

    – Jamylak

    19 de junio de 2015 a las 8:43

  • @jamylak string.split() es una opción Estaba preguntando si también se podría hacer con expresiones regulares.

    – Rakholiya Jenish

    19 de junio de 2015 a las 8:44

  • @RakholiyaJenish ¿No puedes usar re.findall ¿opción?

    – Jamylak

    19 de junio de 2015 a las 8:46

Avatar de usuario de Trevor
Trevor

El str.split El método eliminará automáticamente todos los espacios 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

  • @GururajY.S.: str.split() es probablemente la mejor opción para algo tan liviano como esto.

    – Joel Cornett

    11 de junio de 2012 a las 6:11

cuando usas re.split y el patrón dividido contiene grupos de captura, los grupos se conservan en la salida. Si no desea esto, use un grupo que no capture en su lugar.

  • Usando str.split es probablemente mejor para su ejemplo. Solo quería explicar por qué tienes el comportamiento que tienes.

    – BrenBarn

    11 de junio de 2012 a las 6:05

Es muy simple en realidad. Prueba esto:

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

¿Ha sido útil esta solución?