web-dev-qa-db-fra.com

Regex pour faire correspondre les chiffres d'une longueur spécifique

Je cherche à faire correspondre un nombre de 15 chiffres (dans le cadre d'une chaîne de regex plus grande). En ce moment, j'ai

\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d

mais j’ai le sentiment qu’il doit exister une méthode plus propre.

20
MrGlass

Si votre langue regex est compatible Perl: \d{15}.

Il est difficile de dire comment gérer les contours (pour éviter de saisir accidentellement des chiffres supplémentaires) sans connaître le contexte externe dans lequel cet extrait sera utilisé. La solution définitive indépendante du contexte est la suivante:

(?:(?<!\d)\d{15}(?!\d))

Vous pouvez le mettre au milieu de toute expression rationnelle et cela correspondra (et seulement correspondre) à une séquence d’exactement 15 chiffres. Cependant, il est assez maladroit et généralement inutile. Une version plus simple supposant des limites non alphanumériques (par exemple, des espaces autour des chiffres) est la suivante:

(?:\b\d{15}\b)

Mais cela ne fonctionnera pas si les lettres précèdent ou suivent immédiatement la séquence.

Dans les deux cas ci-dessus, le (?:...) extérieur est simplement une construction entre parenthèses pour éviter les problèmes de priorité avec l'expression régulière environnante. Que cela soit nécessaire ou non dépend également du contexte.

24
Marcelo Cantos

Vous pouvez généralement faire des gammes comme suit:

\d{4,7}

ce qui signifie un minimum de 4 et un maximum de 7 chiffres. Dans votre cas particulier, vous pouvez utiliser la variante à un argument, \d{15}.

Les deux formes sont supportées dans Les expressions régulières de Python - recherchent le texte {m,n} sur ce lien.

Et gardez à l'esprit que \d{15} correspondra à quinze chiffres n'importe où dans la ligne, y compris un nombre à 400 chiffres. Si vous voulez vous assurer qu'il n'y en a que quinze, vous utilisez quelque chose comme:

^\d{15}$

qui utilise les ancres de début et de fin, ou

^\D*\d{15}\D*$

qui permet arbitraire non-chiffres de chaque côté.

29
paxdiablo

Il y a deux façons pour moi de limiter le nombre.

en utilisant len ,

num = 1234
len(str(num)) <= 4

Cette sortie sera True/False.

using expression régulière ,

import re
num = 12324
re.match(r'(?:(?<!\d)\d{4}(?!\d))', str(num))

La sortie sera un objet d'expression régulière ou aucun.

0
FeLiX StEpHeN