2010-01-16 25 views
163

que tiene esta cadena:Sustituto espacios en blanco múltiple con un solo espacio en blanco en Python

mystring = 'Here is some text I  wrote ' 

¿Cómo puedo de sustitución de los espacios en blanco (...) dobles, triples a un solo espacio en blanco para que me sale:

mystring = 'Here is some text I wrote' 
+4

probablemente debería decir 'espacios en blanco múltiples sustituto con un solo espacio * *' desde el espacio en blanco es una clase de caracteres (pestañas, saltos de línea, etc.) –

Respuesta

361

Una simple posibilidad (si usted prefiere evitar RES) es la

' '.join(mystring.split()) 

La dividir y unir realizar la tarea que está pidiendo explícitamente sobre - además, también lo hacen el uno extra que Don No se habla, pero se ve en tu ejemplo, eliminando espacios finales ;-).

+4

Oh fresco, Estaba buscando a tientas una solución similar, pero usando split ('') y luego un filtro para eliminar los elementos vacíos. Nunca supe partir sin argumentos trabajados como este. Esto también es mucho más rápido, timeit.py me da alrededor de 0.74usec para esto, frente a 5.75usec para expresiones regulares. – Roman

+8

@Roman, sí, 'x.split()' (y 'x.split (None)') se divide en _secuencias de espacios en blanco_ (incluidas pestañas, nuevas líneas, etc., como re '' s') de longitud 1+ - y es bastante rápido de hecho. Entonces, ¡siempre me alegro de ayudar! –

+2

esta es una solución muy elegante, pero quiero mencionar que esto también eliminará cualquier salto de línea – trudolf

73
import re 

re.sub('\s+', ' ', mystring).strip() 

esto también sustituirá todas las pestañas, saltos de línea y otros caracteres de "espacio en blanco".

la tira() al final cortará cualquier espacio blanco posterior, como lo solicitó.

19

Para completar, también se puede utilizar:

mystring = mystring.strip() # the while loop will leave a trailing space, 
        # so the trailing whitespace must be dealt with 
        # before or after the while loop 
while ' ' in mystring: 
    mystring = mystring.replace(' ', ' ') 

la que debe trabajar rápidamente en cadenas con relativamente pocos espacios (más rápido que re en estas situaciones).

En cualquier escenario, Alex Martelli's split/join solution funciona al menos tan rápido (generalmente mucho más).

En su ejemplo, utilizando los valores por defecto de timeit.Timer.repeat(), me sale el siguiente horario:

str.replace: [1.4317800167340238, 1.4174888149192384, 1.4163512401715934] 
re.sub:  [3.741931446594549, 3.8389395858970374, 3.973777672860706] 
split/join: [0.6530919432498195, 0.6252146571700905, 0.6346594329726258] 


EDIT:

encontré con que proporciona this post una comparación bastante larga de las velocidades de estos métodos.

+0

Más líneas que las otras, y por lo tanto menos "pitónico", pero más claro. – BuvinJ

-9
string.replace(" ","") 

Todo número par de espacios se eliminan

+0

Eso causaría un error si solo tuviera dos espacios y no solucionara completamente el problema. – parap

+0

Incorrecto. Ni siquiera funciona para el ejemplo dado, ya que da como resultado '' Aquí texto de issome Iwrote '' –

Cuestiones relacionadas