Como señala thedz , puede proporcionar un argumento para quitar caracteres arbitrarios a cualquiera de estas funciones como esta:
s = s.strip(' \t\n\r')
Esto quitará cualquier espacio, \t, \n, o \rpersonajes del lado izquierdo, lado derecho, o ambos lados de la cadena.
Los ejemplos anteriores solo eliminan cadenas de los lados izquierdo y derecho de las cadenas. Si también desea eliminar caracteres del medio de una cadena, intente re.sub:
El último ejemplo es exactamente como usar str.replace(" ",""). No necesita usar re, a menos que tenga más de un espacio, entonces su ejemplo no funciona. []está diseñado para marcar caracteres individuales, no es necesario si está usando solo \s. Utilice uno \s+o [\s]+(innecesario), pero [\s+]no hacer el trabajo, en particular, si desea reemplazar los múltiples espacios con uno solo como convertir "this example" en "this example".
Jorge E. Cardona
3
@ JorgeE.Cardona: algo en lo que estás un poco equivocado \sincluirá pestañas, mientras replace(" ", "")que no lo hará.
Pero esto, por desgracia, también elimina el espacio interior, mientras que el ejemplo en la pregunta original deja intactos los espacios interiores.
Brandon Rhodes
12
#how to trim a multi line string or a file
s=""" line one
\tline two\t
line three """#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.
s1=s.splitlines()print s1
[' line one','\tline two\t','line three ']print[i.strip()for i in s1]['line one','line two','line three']#more details:#we could also have used a forloop from the begining:for line in s.splitlines():
line=line.strip()
process(line)#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:for line in my_file:
line=line.strip()
process(line)#moot point: note splitlines() removed the newline characters, we can keep them by passing True:#although split() will then remove them anyway..
s2=s.splitlines(True)print s2
[' line one\n','\tline two\t\n','line three ']
Después de haber analizado algunas soluciones aquí con diversos grados de comprensión, me pregunté qué hacer si la cadena estaba separada por comas ...
el problema
Al intentar procesar un csv de información de contacto, necesitaba una solución a este problema: recortar espacios en blanco extraños y algo de basura, pero preservar las comas finales y los espacios en blanco internos. Al trabajar con un campo que contenía notas en los contactos, quería eliminar la basura, dejando las cosas buenas. Recortando toda la puntuación y la paja, no quería perder el espacio en blanco entre las fichas compuestas, ya que no quería reconstruir más tarde.
expresiones regulares y patrones: [\s_]+?\W+
El patrón busca instancias únicas de cualquier carácter de espacio en blanco y el guión bajo ('_') de 1 a un número ilimitado de veces de forma perezosa (tan pocos caracteres como sea posible) [\s_]+?antes de que aparezcan caracteres que no sean palabras de 1 a una cantidad ilimitada de tiempo con esto: \W+(es equivalente a [^a-zA-Z0-9_]). Específicamente, esto encuentra franjas de espacios en blanco: caracteres nulos (\ 0), tabulaciones (\ t), líneas nuevas (\ n), avance (\ f), retornos de carro (\ r).
Veo la ventaja de esto como doble:
que no elimina el espacio en blanco entre las palabras / fichas completas que quizás desee mantener juntas;
El método de cadena incorporado de Python strip()no se ocupa dentro de la cadena, solo los extremos izquierdo y derecho, y el argumento predeterminado son caracteres nulos (vea el ejemplo a continuación: varias líneas nuevas están en el texto y strip()no las elimina todas mientras que el patrón de expresiones regulares lo hace) .text.strip(' \n\t\r')
Esto va más allá de la pregunta de los OP, pero creo que hay muchos casos en los que podríamos tener instancias patológicas extrañas dentro de los datos de texto, como lo hice yo (de alguna manera, los caracteres de escape terminaron en parte del texto). Además, en cadenas de tipo lista, no queremos eliminar el delimitador a menos que el delimitador separe dos caracteres de espacio en blanco o algún carácter que no sea de palabra, como '-,' o '-, ,,,'.
NB: No estoy hablando del delimitador del CSV en sí. Solo de instancias dentro del CSV donde los datos son como una lista, es decir, es una cadena cs de subcadenas.
Revelación completa: solo he estado manipulando texto durante aproximadamente un mes, y regexé solo las últimas dos semanas, así que estoy seguro de que me faltan algunos matices. Dicho esto, para colecciones más pequeñas de cadenas (las mías están en un marco de datos de 12,000 filas y 40 columnas impares), como paso final después de un pase para la eliminación de caracteres extraños, esto funciona excepcionalmente bien, especialmente si introduce un espacio en blanco adicional donde desea separar el texto unido por un carácter que no es de palabra, pero no desea agregar espacios en blanco donde antes no había ninguno.
Un ejemplo:
import re
text ="\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109 \n\n\n\nklkjsdf\""print(f"Here is the text as formatted:\n{text}\n")print()print("Trimming both the whitespaces and the non-word characters that follow them.")print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)print(clean_text)print()print("what about 'strip()'?")print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r')# strip out whitespace?print()print(f"Here is the text, formatted as is:\n{clean_text}\n")print()print("Are 'text' and 'clean_text' unchanged?")print(clean_text == text)
Esto produce:
Hereis the text as formatted:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
using regex to trim both the whitespaces and the non-word characters that follow them."portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, [email protected], dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"Very nice.What about 'strip()'?Hereis the text, formatted asis:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Hereis the text, after stipping with'strip':"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Are'text'and'clean_text' unchanged?'True'
Entonces strip elimina un espacio en blanco de a la vez. Entonces, en el caso de los OP, strip()está bien. pero si las cosas se vuelven más complejas, la expresión regular y un patrón similar pueden ser de algún valor para configuraciones más generales.
Si desea recortar el espacio en blanco solo al principio y al final de la cadena, puede hacer algo como esto:
some_string =" Hello, world!\n "
new_string = some_string.strip()# new_string is now "Hello, world!"
Esto funciona de manera muy similar al método QString :: trimmed () de Qt, ya que elimina los espacios en blanco iniciales y finales, dejando solo los espacios en blanco internos.
Pero si desea algo como el método QString :: simplified () de Qt que no solo elimina los espacios en blanco iniciales y finales, sino que también "separa" todos los espacios en blanco internos consecutivos a un carácter de espacio, puede usar una combinación de .split()y " ".join, de esta manera:
some_string ="\t Hello, \n\t world!\n "
new_string =" ".join(some_string.split())# new_string is now "Hello, world!"
En este último ejemplo, cada secuencia de espacios en blanco internos se reemplaza con un solo espacio, mientras se recorta el espacio en blanco del inicio y el final de la cadena.
>>> myStr ="Hi\n Stack Over \r flow!">>> charList =[u"\u005Cn",u"\u005Cr",u"\u005Ct"]>>>import re
>>>for i in charList:
myStr = re.sub(i, r"", myStr)>>> myStr
'Hi Stack Over flow'
Nota: Esto es solo para eliminar "\ n", "\ r" y "\ t" solamente. No elimina espacios adicionales.
¿Por qué usar una expresión regular cuando s.strip()hace exactamente esto?
Ned Batchelder
1
s.strip()solo maneja el espacio en blanco inicial , pero no el espacio en blanco "descubierto" después de eliminar otros caracteres no deseados. Tenga en cuenta que esto eliminará incluso el espacio en blanco después del liderato final\n
Rafe
Alguien rechazó esta respuesta pero no explicó por qué es defectuosa. Vergüenza (@NedBatchelder si el voto negativo fue usted, por favor invierta mientras explicaba su pregunta y no mencionó nada realmente roto con mi respuesta)
Rafe
10
Rafe, es posible que desee verificar dos s.strip()veces : produce exactamente el mismo resultado que su expresión regular.
Ned Batchelder
3
@Rafe, lo estás confundiendo con recortar. Strip realiza las operaciones requeridas.
string.whitespace
.Respuestas:
Espacio en blanco en ambos lados:
Espacio en blanco en el lado derecho:
Espacio en blanco en el lado izquierdo:
Como señala thedz , puede proporcionar un argumento para quitar caracteres arbitrarios a cualquiera de estas funciones como esta:
Esto quitará cualquier espacio,
\t
,\n
, o\r
personajes del lado izquierdo, lado derecho, o ambos lados de la cadena.Los ejemplos anteriores solo eliminan cadenas de los lados izquierdo y derecho de las cadenas. Si también desea eliminar caracteres del medio de una cadena, intente
re.sub
:Eso debería imprimir:
fuente
str.replace(" ","")
. No necesita usarre
, a menos que tenga más de un espacio, entonces su ejemplo no funciona.[]
está diseñado para marcar caracteres individuales, no es necesario si está usando solo\s
. Utilice uno\s+
o[\s]+
(innecesario), pero[\s+]
no hacer el trabajo, en particular, si desea reemplazar los múltiples espacios con uno solo como convertir"this example"
en"this example"
.\s
incluirá pestañas, mientrasreplace(" ", "")
que no lo hará.El
trim
método Python se llamastrip
:fuente
Para espacios en blanco iniciales y finales:
De lo contrario, una expresión regular funciona:
fuente
pat = re.compile(r'\s+')
sub(" ", s)
no""
la tarde se fusionarán las palabras y ya no será capaz de utilizar.split(" ")
a tokenize.print
declaracionesTambién puede usar una función muy simple y básica: str.replace () , funciona con espacios en blanco y pestañas:
Simple y fácil.
fuente
fuente
Nadie ha publicado aún estas soluciones de expresiones regulares.
Pareo:
Buscando (debe manejar el caso de entrada de "solo espacios" de manera diferente):
Si lo usa
re.sub
, puede eliminar los espacios en blanco internos, lo que podría ser indeseable.fuente
El espacio en blanco incluye espacio, pestañas y CRLF . Entonces, una función de cadena elegante y de una línea que podemos usar es traducir .
' hello apple'.translate(None, ' \n\t\r')
O si quieres ser minucioso
fuente
Esto eliminará todos los espacios no deseados y los caracteres de nueva línea. Espero que esto ayude
Esto resultará:
'a b \ nc' se cambiará a 'ab c'
fuente
salida:
Añadiendo el comentario de Le Droid a la respuesta. Para separar con un espacio:
salida:
fuente
Si usa Python 3: en su declaración de impresión, termine con sep = "". Eso separará todos los espacios.
EJEMPLO:
Esto imprimirá: me encantan las papas.
En lugar de: me encantan las papas.
En su caso, dado que intentaría obtener el \ t, haga sep = "\ t"
fuente
Después de haber analizado algunas soluciones aquí con diversos grados de comprensión, me pregunté qué hacer si la cadena estaba separada por comas ...
el problema
Al intentar procesar un csv de información de contacto, necesitaba una solución a este problema: recortar espacios en blanco extraños y algo de basura, pero preservar las comas finales y los espacios en blanco internos. Al trabajar con un campo que contenía notas en los contactos, quería eliminar la basura, dejando las cosas buenas. Recortando toda la puntuación y la paja, no quería perder el espacio en blanco entre las fichas compuestas, ya que no quería reconstruir más tarde.
expresiones regulares y patrones:
[\s_]+?\W+
El patrón busca instancias únicas de cualquier carácter de espacio en blanco y el guión bajo ('_') de 1 a un número ilimitado de veces de forma perezosa (tan pocos caracteres como sea posible)
[\s_]+?
antes de que aparezcan caracteres que no sean palabras de 1 a una cantidad ilimitada de tiempo con esto:\W+
(es equivalente a[^a-zA-Z0-9_]
). Específicamente, esto encuentra franjas de espacios en blanco: caracteres nulos (\ 0), tabulaciones (\ t), líneas nuevas (\ n), avance (\ f), retornos de carro (\ r).Veo la ventaja de esto como doble:
que no elimina el espacio en blanco entre las palabras / fichas completas que quizás desee mantener juntas;
El método de cadena incorporado de Python
strip()
no se ocupa dentro de la cadena, solo los extremos izquierdo y derecho, y el argumento predeterminado son caracteres nulos (vea el ejemplo a continuación: varias líneas nuevas están en el texto ystrip()
no las elimina todas mientras que el patrón de expresiones regulares lo hace) .text.strip(' \n\t\r')
Esto va más allá de la pregunta de los OP, pero creo que hay muchos casos en los que podríamos tener instancias patológicas extrañas dentro de los datos de texto, como lo hice yo (de alguna manera, los caracteres de escape terminaron en parte del texto). Además, en cadenas de tipo lista, no queremos eliminar el delimitador a menos que el delimitador separe dos caracteres de espacio en blanco o algún carácter que no sea de palabra, como '-,' o '-, ,,,'.
NB: No estoy hablando del delimitador del CSV en sí. Solo de instancias dentro del CSV donde los datos son como una lista, es decir, es una cadena cs de subcadenas.
Revelación completa: solo he estado manipulando texto durante aproximadamente un mes, y regexé solo las últimas dos semanas, así que estoy seguro de que me faltan algunos matices. Dicho esto, para colecciones más pequeñas de cadenas (las mías están en un marco de datos de 12,000 filas y 40 columnas impares), como paso final después de un pase para la eliminación de caracteres extraños, esto funciona excepcionalmente bien, especialmente si introduce un espacio en blanco adicional donde desea separar el texto unido por un carácter que no es de palabra, pero no desea agregar espacios en blanco donde antes no había ninguno.
Un ejemplo:
Esto produce:
Entonces strip elimina un espacio en blanco de a la vez. Entonces, en el caso de los OP,
strip()
está bien. pero si las cosas se vuelven más complejas, la expresión regular y un patrón similar pueden ser de algún valor para configuraciones más generales.verlo en acción
fuente
intenta traducir
fuente
Si desea recortar el espacio en blanco solo al principio y al final de la cadena, puede hacer algo como esto:
Esto funciona de manera muy similar al método QString :: trimmed () de Qt, ya que elimina los espacios en blanco iniciales y finales, dejando solo los espacios en blanco internos.
Pero si desea algo como el método QString :: simplified () de Qt que no solo elimina los espacios en blanco iniciales y finales, sino que también "separa" todos los espacios en blanco internos consecutivos a un carácter de espacio, puede usar una combinación de
.split()
y" ".join
, de esta manera:En este último ejemplo, cada secuencia de espacios en blanco internos se reemplaza con un solo espacio, mientras se recorta el espacio en blanco del inicio y el final de la cadena.
fuente
En general, estoy usando el siguiente método:
Nota: Esto es solo para eliminar "\ n", "\ r" y "\ t" solamente. No elimina espacios adicionales.
fuente
para eliminar espacios en blanco del medio de la cadena
salida:
fuente
Esto eliminará todos los espacios en blanco y las nuevas líneas del principio y el final de una cadena:
fuente
s.strip()
hace exactamente esto?s.strip()
solo maneja el espacio en blanco inicial , pero no el espacio en blanco "descubierto" después de eliminar otros caracteres no deseados. Tenga en cuenta que esto eliminará incluso el espacio en blanco después del liderato final\n
s.strip()
veces : produce exactamente el mismo resultado que su expresión regular.