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

Responder a