2010-10-21 17 views
22

^(\s+) solo elimina el espacio en blanco de la primera línea. ¿Cómo elimino el espacio en blanco delantero de todas las líneas?Python: use la expresión regular para eliminar el espacio en blanco de todas las líneas

+0

espacios en blanco incluye caracteres de nueva línea, lo que significa que todo terminará en una sola línea, si usa esto en una cadena multilínea. ¡muéstranos algo para que podamos ayudar a entender la pregunta! – rdrey

+0

@rdrey: en realidad, '^' en el modo multilínea coincide * después * de cada nueva línea, por lo que no será un problema (excepto para "\ n \ n"). Ver mi respuesta – AndiDog

+0

gracias por esa corrección. aprendiendo algo nuevo todos los días: D – rdrey

Respuesta

24

módulo de expresiones regulares de Python no sea por defecto multi-line ^ matching , por lo que debe especificar ese indicador explícitamente.

r = re.compile(r"^\s+", re.MULTILINE) 
r.sub("", "a\n b\n c") # "a\nb\nc" 

# or without compiling (only possible for Python 2.7+ because the flags option 
# didn't exist in earlier versions of re.sub) 

re.sub(r"^\s+", "", "a\n b\n c", flags = re.MULTILINE) 

# but mind that \s includes newlines: 
r.sub("", "a\n\n\n\n b\n c") # "a\nb\nc" 

También es posible incluir la línea bandera para el patrón:

re.sub(r"(?m)^\s+", "", "a\n b\n c") 

Una solución más fácil es evitar expresiones regulares debido a que el problema original es muy simple:

content = 'a\n b\n\n c' 
stripped_content = ''.join(line.lstrip(' \t') for line in content.splitlines(True)) 
# stripped_content == 'a\nb\n\nc' 
+0

'"^\ s + "' también elimina las líneas vacías –

6

puede probar strip() si desea eliminar parte delantera y trasera, o lstrip() si delante

>>> s=" string with front spaces and back " 
>>> s.strip() 
'string with front spaces and back' 
>>> s.lstrip() 
'string with front spaces and back ' 

for line in open("file"): 
    print line.lstrip() 

Si realmente desea utilizar expresiones regulares

>>> import re 
>>> re.sub("^\s+","",s) # remove the front 
'string with front spaces and back ' 
>>> re.sub("\s+\Z","",s) 
' string with front spaces and back' #remove the back 
1
nowhite = ''.join(mytext.split()) 

NO espacios en blanco se mantendrá como usted pidió (todo se pone como una palabra). Más útil es juntar todo con ' ' o '\n' para mantener las palabras por separado.

0

Vas a tener que utilizar la opción re.MULTILINE:

re.sub("(?m)^\s+", "", text) 

El "(? M)" parte permite multilínea.

8

@AndiDog reconoce en su respuesta (actualmente aceptada) que mastica nuevas líneas consecutivas.

Así es cómo solucionar esa deficiencia, que se debe al hecho de que \n es AMBOS espacios en blanco y un separador de línea. Lo que tenemos que hacer es crear una nueva clase que incluya solo espacios en blanco que no sean nueva línea.

Queremos whitespace and not newline, que no se puede expresar directamente en una clase nueva. Vamos a reescribir eso como not not (whitespace and not newline) es decir not(not whitespace or not not newline (gracias, Augustus) es decir not(not whitespace or newline) es decir [^\S\n] en notación re.

Así:

>>> re.sub(r"(?m)^[^\S\n]+", "", " a\n\n \n\n b\n c\nd e") 
'a\n\n\n\nb\nc\nd e' 
0

que en realidad no necesitan expresiones regulares de este mayor parte del tiempo. Si sólo está buscando para eliminar común hendidura a través de múltiples líneas, tratar el módulo textwrap:

>>> import textwrap 
>>> messy_text = " grrr\n whitespace\n everywhere" 
>>> print textwrap.dedent(messy_text) 
grrr 
whitespace 
everywhere 

Tenga en cuenta que si el sangrado es irregular, esto será mantenida:

>>> very_messy_text = " grrr\n \twhitespace\n everywhere" 
>>> print textwrap.dedent(very_messy_text) 
grrr 
     whitespace 
everywhere 
Cuestiones relacionadas