para - patrones expresiones regulares python
Expresión regular de Python: haciendo coincidir un paréntesis entre paréntesis (5)
En primer lugar, usar /(
no es suficiente para coincidir con un paréntesis. Python normalmente reacciona a algunas secuencias de escape en sus cadenas, por lo que interpreta /(
como simple (
. Tendría que escribir //(
o utilizar un cadena en bruto, por ejemplo, r''/(''
o r"/("
.
Segundo, cuando usa re.match
, está anclando la búsqueda de re.match
regulares al inicio de la cadena. Si desea buscar el patrón en cualquier parte de la cadena, use re.search
.
Como dijo Joseph en su respuesta, no está exactamente claro qué es lo que quieres encontrar. Por ejemplo:
string = "TEMPLATES = ( (''index.html'', ''home''), (''base.html'', ''base''))"
print re.findall(r''/([^()]*/)'', string)
["(''index.html'', ''home'')", "(''base.html'', ''base'')"]
EDITAR:
Estoy corregido, @phooji tiene razón : el escape es irrelevante en este caso específico. Pero re.match
vs. re.search
o re.findall
sigue siendo importante.
He estado tratando de hacer coincidir la siguiente cadena:
string = "TEMPLATES = ( (''index.html'', ''home''), (''base.html'', ''base''))"
Pero, lamentablemente, mi conocimiento de las expresiones regulares es muy limitado, como puede ver, hay dos paréntesis que deben coincidir, junto con el contenido dentro del segundo que intenté usar re.match("/(w*/)", string)
pero no funcionó, cualquier ayuda sería apreciada grandemente.
Mejor uso del módulo de análisis adecuado como pyparsing aquí.
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))
Salida:
index.html <-> home
base.html <-> base
Explicación:
outer
coincide con el primer grupo de paréntesis de inicio usando /(
y /)
; de forma predeterminada, la 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 .+
del outer
.
innerre
coincide exactamente con uno de sus pares (''a'', ''b'')
, nuevamente usa /(
y /)
para hacer coincidir los parens de contenido en su cadena de entrada, y usa dos grupos dentro de la '' ''
para hacer coincidir las cadenas dentro de esos únicos citas.
Luego, usamos findall
(en lugar de search
o match
) para obtener todas las coincidencias para innerre
(en lugar de solo una). En este punto, los results
son una lista de pares, como lo demuestra el ciclo de impresión.
Actualización: Para hacer coincidir todo el asunto, puedes intentar algo como esto:
rx = re.compile("^TEMPLATES = /(.+/)")
rx.match(w)
Si sus cadenas parecen código válido de Python, puede hacer esto:
import ast
var, s = [part.strip() for part in
"TEMPLATES = ( (''index.html'', ''home''), (''base.html'', ''base''))".split(''='')]
result= ast.literal_eval(s)
Su muestra busca paren abierto seguido de cero o más letras w seguidas de paren cerrado. Probablemente desee usar / w en lugar de w, pero eso no funcionará en su caso de todos modos, porque tiene caracteres que no son palabras junto al parén abierto.
Creo que deberías considerar dividir la cadena en las comas en su lugar. ¿Cuál es tu objetivo final?