TransWikia.com

Python - ayuda con regex

Stack Overflow en español Asked by Gonzalo Rojo on August 27, 2021

Tengo problemas con las regex: necesito extraer lo que esta dentro de las comillas de :respuesta , o sea necesito extraer TEST1 y TEST2

import re

txt = '{:id 13, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST1"} {:id 14, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST2"}'

pattern = ':respuesta "(.*)"'

x = re.findall(pattern, txt)
print(x)

Probé de esa manera pero no estaría funcionando como necesito.

3 Answers

Intentemos con esto:

txt = '{:id 13, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST1"} {:id 14, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST2"}'

re.findall(r':respuestas"(.*?)"', txt)

Y obtenemos lo siguiente:

['TEST1', 'TEST2']

Veamos un poco más de cerca la aproximación.

Nuestra expresión regular es :respuestas"(.*?)", en donde tenemos los caracteres:

  • s que nos indican que va a haber un espacio. Esto lo ponemos para hacerlo más claro a la vista puesto que un simple , no se nota tanto como un s
  • luego tenemos "(.*?)" utilizamos el signo de interrogación para indicarle que el match no se pasé de glotón y sólo llegue hasta antes de la primera comilla doble.

Correct answer by Cuauhtli on August 27, 2021

Un patrón simple que funciona es:

pattern = ':respuesta "([^"]*)"'

La idea es que lo buscado es cualquier cosa que no sea una cremilla doble. Este patrón no funciona si la :respuesta trae cremillas dobles incorporadas.

Comprobación

import re
txt = '{:id 13, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST1"} {:id 14, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST2"}'

pattern = ':respuesta "([^"]*)"'
x = re.findall(pattern, txt)
print(x)

produce

['TEST1', 'TEST2']

que es una lista de todos los términos encontrados en el string.

Answered by Candid Moe on August 27, 2021

Puedes usar el Non-Greedy Qualifier *? para obtener el texto hasta el siguiente ".

El problema que se te presenta es que al haber " posteriores, el calificador * sigue consumiendo caracteres después del primer ".

import re

txt = '{:id 13, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST1"} {:id 14, :tipo "texto", :etiqueta "Observaciones", :requerido false, :respuesta "TEST2"}'

pattern = ':respuesta "(.*?)"'

x = re.findall(pattern, txt)

print(x)

Salida

['TEST1', 'TEST2']

Answered by Lino Contreras on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP