Spécification d’une expression régulière pour le plus court appariement

Vous essayez de faire apparier un motif de texte à l’aide d’expressions régulières, mais il s’agit d’identifier les appariements les plus longs possibles d’un motif. Au lieu de cela, vous aimeriez le modifier pour trouver la correspondance la plus courte possible.

Ce problème survient souvent dans les modèles qui tentent de faire correspondre le texte enfermé à l’intérieur d’une paire de délimiteurs de début et de fin (par exemple, une chaîne de caractères entre guillemets). A titre d’exemple, prenons cet exemple:

>>> str_motif = re.compile(r'\"(.*)\"')
>>> texte1 = 'Site web affiche "no."'
>>> str_motif.findall(texte1)
['no.']

>>> texte2 = 'Site web affiche "no." Application affiche "yes."'
>>> str_motif.findall(texte2)
['no." Application affiche "yes.']

>>>

 

Dans cet exemple, le motif r’\”(.*)\”‘ tente d’apparier le texte entre guillemets. Cependant, l’opérateur * dans une expression régulière est gourmand, donc la correspondance est basée sur la recherche de la correspondance la plus longue possible.

Ainsi, dans le deuxième exemple concernant le texte2, il ne correspond pas correctement aux deux chaînes de caractères citées. Pour résoudre ce problème, ajoutez le modificateur ? après l’opérateur * dans le motif, comme ceci:

>>> texte2 = 'Site web affiche "no." Application affiche "yes."'
>>> str_motif = re.compile(r'\"(.*?)\"')
>>> str_motif.findall(texte2)
['no.', 'yes.']

>>>

 

Cela rend l’appariement non gourmand, et produit l’appariement le plus court à la place. Cette recette aborde l’un des problèmes les plus courants rencontrés lors de l’écriture d’expressions régulières impliquant le caractère point (.).

Dans un motif de texte, le point correspond à n’importe quel caractère sauf une nouvelle ligne. Cependant, si vous mettez entre crochets le point avec le texte de début et de fin (comme une citation), l’appariement tentera de trouver la correspondance la plus longue possible avec le motif.

Ainsi, plusieurs occurrences du texte de début ou de fin sont ignorées et incluses dans les résultats du match le plus long. L’ajout du ? juste après des opérateurs tels que * ou + force l’algorithme d’appariement à rechercher la correspondance la plus courte possible.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here