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