2012-01-01 20 views
29

Quería saber cuál es la función pitonica para esto:¿Cómo eliminar un prefijo de ruta en Python?

Quiero eliminar todo antes de la ruta wa.

p = path.split('/') 
counter = 0 
while True: 
    if p[counter] == 'wa': 
     break 
    counter += 1 
path = '/'+'/'.join(p[counter:]) 

Por ejemplo, quiero '/ libro/html/wa/foo/bar /' para convertirse en '/ wa/foo/bar /'

+6

Fyi, cuando se trata de rutas mejor utilizar las funciones de división/unión del módulo 'os.path' – ThiefMaster

Respuesta

22
>>> path = '/book/html/wa/foo/bar/' 
>>> path[path.find('/wa'):] 
'/wa/foo/bar/' 
+0

+1: en comparación con el uso de una expresión regular, esto es más simple, y probablemente tan rápido. – EOL

+2

Esto devuelve el último carácter si la cadena no contiene '/ wa' (' ruta [-1:] '), por lo que, si eso ocurriera, querría verificar' if "/ wa" en la ruta' primero – dbr

+4

alternativamente, puede usar 'str.index' en lugar de' str.find' para generar una excepción cuando la aguja no está en el pajar. – SingleNegationElimination

2
import re 

path = '/book/html/wa/foo/bar/' 
m = re.match(r'.*(/wa/[a-z/]+)',path) 
print m.group(1) 
+0

Esto ayuda a mi segunda pregunta que era cómo eliminar la última ruta si se trata de un número entero. Niza :) – Natim

4

Para Python 3.4+, debe usar pathlib.PurePath.relative_to. De la documentación:

>>> p = PurePosixPath('/etc/passwd') 
>>> p.relative_to('/') 
PurePosixPath('etc/passwd') 

>>> p.relative_to('/etc') 
PurePosixPath('passwd') 

>>> p.relative_to('/usr') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "pathlib.py", line 694, in relative_to 
    .format(str(self), str(formatted))) 
ValueError: '/etc/passwd' does not start with '/usr' 

Véase también this StackOverflow question para más respuestas a su pregunta.

Cuestiones relacionadas