El ? va junto al * que queremos que no sea codicioso: pattern = re.compile("^(?P<type>(.*?)): (?P<value>(.*))$")
Ponerlo junto al : hace que ese carácter sea opcional. In [20]: p = re.compile("^(?P<type>(.*)):? (?P<value>(.*))$") In [21]: l = "hola mundo" In [22]: m = p.match(l) In [23]: m.groupdict() Out[23]: {'type': 'hola', 'value': 'mundo'} Missatge de Ander Garmendia <kelertx...@gmail.com> del dia dl., 17 d’ag. 2020 a les 16:43: > Uuups, te he pegado una expresión que está mal. La correcta es esta: > > pattern = re.compile("^(?P<type>(.*)):? (?P<value>(.*))$") > > Perdona las molestias. > > Jose Caballero <jcaballero....@gmail.com> igorleak hau idatzi zuen (2020 > abu. 17, al. 16:37): > >> no parece: >> >> >>> p = re.compile("^(?P<type>(.*)):? (?P<value>([^:]*))$") >> >>> >> >>> l = "type: word: foo bar" >> >>> >> >>> m = p.match(l) >> >>> print m.groupdict() >> {'type': 'type: word: foo', 'value': 'bar'} >> >>> >> >> Pero voy a echar un vistazo a "greedy". >> Muchas gracias. >> >> Jose >> >> El lun., 17 ago. 2020 a las 15:25, Ander Garmendia >> (<kelertx...@gmail.com>) escribió: >> > >> > Hola, >> > >> > Las expresiones tipo(. *) son "greedy", esto es se expanden "a todo lo >> que pillen". Si quieres limitar el match al primer grupo, añade un ? al >> carácter de corte: >> > >> > pattern = re.compile("^(?P<type>(.*)):? (?P<value>([^:]*))$") >> > >> > Si buscas "greedy" en el apartado de la librería "re" en la >> documentacion oficial, lo explican mucho mejor. >> > >> > Un saludo. >> > >> > Jose Caballero <jcaballero....@gmail.com> igorleak hau idatzi zuen >> (2020 abu. 17, al. 15:45): >> >> >> >> Hola, >> >> >> >> tengo una serie de lineas, todas con el mismo formato: >> >> >> >> <type>: <value> >> >> >> >> donde <type> es una sola palabra, y <value> es una frase. >> >> Intentaba "parsearlas" con algo como esto: >> >> >> >> pattern = re.compile("^(?P<type>(.*)): (?P<value>(.*))$") >> >> parse = pattern.match(line) >> >> groups = parse.groupdict() >> >> print( groups["type"] ) >> >> print( groups["value"] ) >> >> >> >> Funciona bien, salvo que <value> incluya el signo de los dos puntos. >> >> Por ejemplo, para >> >> >> >> one: two: three four >> >> >> >> Me devuelve type = "one: two" y value "three four", en lugar de "one" >> >> y "two: three four" respectivamente. >> >> >> >> ?Como arreglo ese pattern para que el primer "lookahead" pare en el >> primer ":"? >> >> [Creo que se nota que tengo poca experiencia con regex] >> >> >> >> Muchas gracias. >> >> Un saludo, >> >> Jose >> >> _______________________________________________ >> >> Python-es mailing list >> >> Python-es@python.org >> >> https://mail.python.org/mailman/listinfo/python-es >> > >> > _______________________________________________ >> > Python-es mailing list >> > Python-es@python.org >> > https://mail.python.org/mailman/listinfo/python-es >> _______________________________________________ >> Python-es mailing list >> Python-es@python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es@python.org > https://mail.python.org/mailman/listinfo/python-es >
_______________________________________________ Python-es mailing list Python-es@python.org https://mail.python.org/mailman/listinfo/python-es