2010-05-04 13 views
34

necesito asociar dos casos por una de las expresiones reg y hacer la sustituciónCómo reemplazar sólo una parte del partido con re.sub pitón

'long.file.name.jpg' -> 'long.file.name_ suf .jpg'

'long.file.name_ un .jpg' -> 'long.file.name_ suf .jpg'

que estoy tratando de hacer lo siguiente

re.sub('(\_a)?\.[^\.]*$' , '_suff.',"long.file.name.jpg") 

Pero esto se corta la extensión '.jpg' y yo estoy poniendo

long.file.name_suff. en lugar de long.file.name_suff.jpg Entiendo que esto se debe a [^.] * $ parte, pero no puedo excluirlo, porque Tengo que encontrar la última ocurrencia de '_a' para reemplazar o durar ' . '

¿Hay alguna manera de reemplazar solo una parte del partido?

+0

por qué está escapando de subrayado '(\\ _ a)?' – Amarghosh

Respuesta

17
re.sub(r'(?:_a)?\.([^.]*)$', r'_suff.\1', "long.file.name.jpg") 

?: inicia un bloque de coincidencia no (SO answer), por lo (?:_a) es vincular el _a pero no la enumeración de ella, la siguiente interrogante hace que sea opcional.

Así que en Inglés, que dice esto, que coincida con el final .<anything> que sigue (o no) el patrón _a

Otra manera de hacer esto sería utilizar una búsqueda hacia atrás (see here). Menciono esto porque son muy útiles, pero no los conozco durante 15 años haciendo RE

+26

Esta respuesta no tiene explicación. – PLPeeters

+0

¿Puedes explicarlo? –

72

Coloque un grupo de captura alrededor de la parte que desea conservar, y luego incluya una referencia a ese grupo de captura dentro del texto de reemplazo.

re.sub(r'(\_a)?\.([^\.]*)$' , r'_suff.\2',"long.file.name.jpg") 
+13

Gracias por la explicación de lo que está haciendo. – GreenMatt

+0

@Amber: deduzco de su respuesta que, a diferencia de str.replace(), no podemos usar las variables a) en cadenas sin formato; o b) como argumento para re.sub; o c) ambos. a) tiene sentido (creo) pero no estoy seguro acerca de b). Sin embargo, parece que podemos usar un nombre de variable para la cadena que está pasando la expresión regular. ¿Te importaría dilucidar? Gracias. –

7

Sólo hay que poner la expresión para la extensión en un grupo, capturarlo y hacer referencia a la coincidencia en la sustitución:

re.sub(r'(?:_a)?(\.[^\.]*)$' , r'_suff\1',"long.file.name.jpg") 

Además, utilizando el grupo de no capturar (?:…) va a evitar que se vuelva a almacenar mucha información innecesaria.

+3

Necesita escapar de la barra invertida en '\ 1' o ponerla en' r''' en lugar de solo ''''. – Amber

1

Puede hacerlo excluyendo las piezas de la sustitución. Quiero decir, puedes decirle al módulo de expresión regular; "coincide con este patrón, pero reemplaza una pieza".

re.sub(r'(?<=long.file.name)(\_a)?(?=\.([^\.]*)$)' , r'_suff',"long.file.name.jpg") 
>>> 'long.file.name_suff.jpg' 

long.file.name y .jpg partes están siendo utilizados en la coincidencia, pero que excluyen de la sustitución.

Cuestiones relacionadas