3 votes

RegEx: Omettre le premier zéro unique dans les numéros de vol

J'ai besoin d'une RegEx pour formater les numéros de vol afin de conserver le code de la lettre et les chiffres suivants, mais omettre le zéro initial s'il est seul et que le nombre total de chiffres est d'au moins quatre. Cela est utilisé dans iOS Shortcuts qui est un flux de travail simplifié avec des actions. Je peux utiliser une action de correspondance avec RegEx. Exemples de résultats souhaités:

SK0498 devrait retourner SK498 (nombre total de chiffres = 4 = omettre le zéro initial unique)

AA007 devrait toujours retourner AA007 (parce que les zéros initiaux sont doublés, et le nombre total de chiffres est seulement 3)

UA2138 retourne UA2138 (pas de zéros initiaux impliqués)

BA023 devrait retourner BA023 (garder le zéro car le nombre total de chiffres est seulement 3), cependant BA0234 devrait retourner BA234 (nombre total de chiffres est 4 avec un seul zéro initial qui doit être omis).

Je ne suis pas doué avec RedEx mais jusqu'à présent, j'ai compris (?=0*)(00)*([1-9][\d]*). Cela omet correctement le premier zéro tant qu'il n'est pas double mais je suis seulement à mi-chemin. Je veux aussi qu'il renvoie le code de la lettre, tout en respectant la règle des 4 chiffres minimum pour que le zéro initial soit omis. (Si la chaîne contient 4 chiffres avec un seul zéro initial, omettre le premier, sinon le garder). Si c'est même possible avec autant de critères, comment cela doit-il être?

4voto

The fourth bird Points 40138

Si vous voulez omettre le premier zéro unique, vous pouvez utiliser un groupe de capture pour les caractères majuscules initiaux et utiliser ce groupe dans le remplacement:

\b([A-Z]+)0(?=[1-9]\d{2}\b)

Le motif correspond à:

  • \b Une frontière de mot pour empêcher une correspondance partielle de mot
  • ([A-Z]+) Capture groupe 1, correspondance à 1+ caractères A-Z
  • 0 Correspondance du zéro (si vous voulez correspondre à 1 ou plusieurs zéros, alors 0+)
  • (?=[1-9]\d{2}\b) Regard en avant positif, affirme un chiffre 1-9 suivi de 2 chiffres et d'une frontière de mot (4 chiffres consécutifs au total)

Démonstration Regex

Si une règle minimale de 4 chiffres existe, vous pouvez omettre la dernière frontière de mot et affirmer au moins 2 chiffres :

\b([A-Z]+)0(?=[1-9]\d{2})

S'il peut y avoir 3 chiffres à droite avec un zéro initial, et que vous voulez supprimer uniquement le premier zéro:

\b([A-Z]+)0(?=\d{3}\b)

Démonstration Regex

1voto

coder00 Points 734

Vous pouvez également essayer de trouver des lettres et les trois derniers chiffres puis les concaténer comme suit :

import re

for s in ['BA023', 'BA0432', 'BA0007']:
  numbers = re.findall('\d+', s)[0][-3:]
  alpha = re.findall('[a-zA-Z]+', s)[0]
  print(alpha+numbers, s)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X