Prueba esto:
import re
w = "TEMPLATES = (('index.html', 'home'), ('base.html', 'base'))"
# find outer parens
outer = re.compile("\((.+)\)")
m = outer.search(w)
inner_str = m.group(1)
# find inner pairs
innerre = re.compile("\('([^']+)', '([^']+)'\)")
results = innerre.findall(inner_str)
for x,y in results:
print("%s <-> %s" % (x,y))
de salida:
index.html <-> home
base.html <-> base
Explicación:
outer
coincide con el primer grupo de partida paréntesis utilizando \(
y \)
; de forma predeterminada, search
encuentra la coincidencia más larga, lo que nos da el par más externo ()
. La coincidencia m
contiene exactamente lo que hay entre esos paréntesis externos; su contenido corresponde al .+
bit de outer
.
innerre
partidos exactamente uno de sus pares ('a', 'b')
, utilizando de nuevo \(
y \)
para que coincida con los parens contenido en su cadena de entrada, y utilizando dos grupos dentro del ' '
para que coincida con las cuerdas dentro de las comillas simples.
A continuación, utilizamos findall
(en lugar de search
o match
) para obtener todos los partidos para innerre
(en lugar de sólo uno). En este punto, results
es una lista de pares, como lo demuestra el ciclo de impresión.
Actualización: para que coincida con todo el asunto, podría intentar algo como esto:
rx = re.compile("^TEMPLATES = \(.+\)")
rx.match(w)
gracias por la respuesta, pero ¿es posible hacer coincidir toda la cadena incluyendo la parte "TEMPLATES =" para que pueda reemplazar todo con otra cadena ? – Paulo
@paulo: He agregado una expresión regular que coincide con toda la cadena. – phooji
muchas gracias, realmente agradezco su ayuda, y gracias a todos los que contribuyeron: D – Paulo