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.
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
"(.*?)"
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP