Expresiones regulares codiciosa y no codiciosa

Dado que (Ha){3,5} puede coincidir con tres, cuatro o cinco instancias de Ha en la cadena 'HaHaHaHaHa', puede preguntarse por qué la llamada del objeto Match a group() en el ejemplo anterior de las llaves devuelve ‘HaHaHaHaHa’ en lugar de las posibilidades más cortas. Después de todo, 'HaHaHa' y 'HaHaHaHa' son también coincidencias válidas de la expresión regular (Ha){3,5}.

Las expresiones regulares de Python son codiciosas por defecto, lo que significa que en situaciones ambiguas coincidirán con la cadena más larga posible. La versión no codiciosa (también llamada perezosa) de las llaves, que coincide con la cadena más corta posible, tiene la llave de cierre seguida de un signo de interrogación.

Introduzca lo siguiente en el intérprete de comandos interactivo, y observe la diferencia entre las formas codiciosas y no codiciosas de las llaves que buscan la misma cadena:

>>> import re
>>> greedyHaRegex = re.compile(r'(Ha){3,5}')
>>> mo1 = greedyHaRegex.search('HaHaHaHaHa')
>>> mo1.group()
'HaHaHaHaHa'

>>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?')
>>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa')
>>> mo2.group()
'HaHaHa'

Tenga en cuenta que el signo de interrogación puede tener dos significados en las expresiones regulares: declarar una coincidencia no codiciosa o marcar un grupo opcional. Estos significados no tienen nada que ver.

Deja una respuesta