2011-07-20 14 views
5

Esto no funciona:Reemplazar con \/Python

import re 
re.sub('\\', '/', "C:\\Users\\Judge") 

error:

Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    re.sub('\\', '/', "C:\\Users") 
    File "C:\Python27\lib\re.py", line 151, in sub 
    return _compile(pattern, flags).sub(repl, string, count) 
    File "C:\Python27\lib\re.py", line 244, in _compile 
    raise error, v # invalid expression 
error: bogus escape (end of line) 

Respuesta

7

Trate escapar dos barras invertidas en lugar de uno: \\\\

re.sub('\\\\', '/', "C:\\Users\\Judge")

Usted están pasando el motor de RE una barra invertida, que lo confunde. Por lo tanto, no solo debe escapar de las barras diagonales inversas para que Python sea feliz, necesita escaparse nuevamente para RE. Como estás escapando dos barras diagonales inversas, necesitas cuatro en total.

Si no está utilizando cualquier característica de expresiones regulares, tal vez sería mejor con el método más sencillo reemplazar la cadena:

'C:\\Users\\Judge'.replace('\\', '/')

+0

¿Por qué en el mundo no puede tratarlo como una cadena sin procesar? ¡Esto no tiene ningún sentido para mí! – chaz

4

que no es necesario una expresión regular para un cambio tan simple . Y la cita se hace más fácil a continuación:

"C:\\Users\\Judge".replace("\\", "/") 
2

También puede utilizar cadenas primas:

re.sub(r'\\', '/', 'C:\\Users') 

Nota del r delante de la cadena de búsqueda que interpreta de manera diferente barras invertidas de cadenas normales. Es decir, las secuencias de control como \ n se tomarán literalmente, es decir, como una barra invertida seguida de n en lugar de una nueva línea.

+1

Esta es la forma correcta. Tenga en cuenta, sin embargo, que incluso una cadena en bruto no puede terminar con un número impar de barras invertidas. – agf

+0

Vea el primer párrafo en http://docs.python.org/library/re.html –

1
"C:\\Users\\Judge".replace('\\', '/') 

En cuanto a los patrones de expresiones regulares, usa r'\\'

1

Suponiendo desea normalizar su camino, y no sólo en general, preguntando cómo convertir las barras invertidas en otros más adelante, se puede utilizar el path.normpath() lugar. Pero reconozco que puede no funcionar exactamente como se esperaba, ya que están tratando de convertir lejos de las ventanas en forma, pero tenga en cuenta este ejemplo:

import os2emxpath as path 
print path.normpath("C:\\windows\\hello") 

impresiones

C:/windows/hello

EDITAR Como puntos Oben En los comentarios, la secuencia de barra diagonal inversa es la forma correcta para Windows, por lo que debería funcionar para la mayoría de sus necesidades. Sin embargo, si desea cambiar eso a alguna otra forma, puede importar el módulo de ruta correspondiente.

+1

-1: Accroding a [docs] (http://docs.python.org/library/os.path.html# os.path.normpath) este colapso de los separadores redundantes y en las barras de Windows se convierten en barras invertidas (pero no al revés). –

+0

@Oben Es cierto, pero puede pretender que no está en Windows e importar el módulo correspondiente. Después de todo eso es lo que sugiere el asker, porque ¿por qué querríamos modificar una cadena de directorio que funcionaría bien en Windows? – Gleno

+0

Gleno, no me malinterpreten, 'os.path.normpath' es una buena herramienta para recomendar en general. Sin embargo, el OP no proporciona mucho contexto acerca de cuáles son sus objetivos finales: al tomar la pregunta tal como está, 'normpath' no es la solución. Además, importar 'os2emxpath' para forzar el corte directo es una especie de hack sucio. Estoy dispuesto a deshacer mi voto negativo una vez que el OP aclare que de hecho está buscando una normalización de 'norpath'. –

1

Es necesario utilizar \\\\:

re.sub('\\\\', '/', "C:\\Users\\Judge") 

o utilizar el modificador r:

re.sub(r'\\', '/', "C:\\Users\\Judge") 

Ver Python documentation on re.