2
votes

Regex pour masque IBAN

J'essaye d'extraire ce texte "NL dd ABNA ddddddddd" de la chaîne:

NL\s?\d{2}\s?[A-Z]{4}0\s?\d{9}$

Et cette chaîne peut avoir trois variantes ou plus.

Pourtant je ' Je n'en suis venu qu'à ceci:

IBAN NL 91ABNA0417463300
IBAN NL91ABNA0417164300
Iban: NL 69 ABNA 402032566

Ce qui correspond aux deux premiers exemples, mais pas au troisième.

Voir: https://regex101.com/r/zGDXa2/1 .

Comment puis-je le traiter?


6 commentaires

Veuillez mettre un exemple minimal reproductible dans la question .


Pourquoi ne supprimez-vous pas tous les espaces blancs? Cela rendrait le regex plus facile. En python, vous pouvez faire phrase = 'bonjour pomme' , phrase.replace ("", "")


Je mettrais également les chaînes en majuscules, de cette façon vous évitez d'inclure des lettres minuscules dans l'expression régulière. Utilisez simplement `phrase.upper ()`


essayez ce NL. * \ d {9} $ regex101.com/r/f9JVP2/4


Quelle est votre sortie souhaitée?


avez-vous cherché SO? stackoverflow.com/questions/44656264 ou stackoverflow. com / questions / 23471591 ou stackoverflow.com/questions/tagged/iban+regex ?


4 Réponses :


0
votes

Vous pouvez simplement supprimer tous les espaces et mettre en majuscule le reste, comme ceci:

NL\d{2}ABNA(\d{10}|\d{9})

Et puis votre regex serait:

iban = NL 91ABNA0417463300
iban.replace(" ", "")
iban.upper()

Cela fonctionne dans https://regex101.com/r/zGDXa2/1


0 commentaires

3
votes

Le problème dans votre démo regex101 est qu'il y a un caractère supplémentaire dans votre expression régulière après $ alors supprimez-le et remplacez 0 par [0] code> et cela corrige tout et commence également à correspondre à votre troisième ligne. L'expression régulière correcte devient,

NL\s?\d{2}\s?[A-Z]{4}[0 ]\s?\d{9}$

Vérifiez votre démo mise à jour


0 commentaires

0
votes

Ce n'est pas ce que vous voulez, mais cela fonctionne.

IBAN a un format strict, il est donc préférable de le normaliser, et ensuite de couper une partie, car tout correspondra à l'expression rationnelle, par exemple:

CODE

91 0417463300
91 0417164300
69 402032566

OUTPUT

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# I'm not sure, that alphabet is correct, A-Z, 0-9
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"


def normalize(string):
    stage1 = "".join(IBAN.split()).upper()
    stage2 = ''
    for l in stage1:
        if l in alphabet:
            stage2 = stage2 + l

    return stage2.split('IBAN')[1]


if __name__ == '__main__':

    IBAN_LIST = ['IBAN NL 91ABNA0417463300', 'IBAN NL91ABNA0417164300', 'Iban: NL 69 ABNA 402032566']

    for IBAN in IBAN_LIST:
        IBAN_normalized = normalize(IBAN)
        print(IBAN_normalized[2:4], IBAN_normalized[8:])

Ce n'est pas un regexp, mais devrait fonctionner plus rapidement, mais si vous savez comment normaliser mieux, merci de nous aider.

Vous pouvez voir le code source ici .


0 commentaires

1
votes

Vous pouvez utiliser l'expression régulière suivante:

NL 11abna0317164300
NL21ABNA0417134300
NL 29 ABNA 401422366
NL 39 ABNA 0822416395
NL 39 ABNA 0822416395

demo:

https://regex101.com/r/zGDXa2/11

Si vous travaillez en python, vous pouvez supprimer le ( ?: i) et remplacez-le par un drapeau re.I ou re.IGNORECASE

Testé sur: strong>

Uw BTW nummer NL80
 IBAN NL 11abna0317164300asdfasf234
iBAN NL21ABNA0417134300 22
Iban: NL 29 ABNA 401422366f sdf
IBAN :NL 39 ABNA 0822416395s
IBAN:NL 39 ABNA 0822416395s

Extraits:

(?i)(?:(?<=IBAN(?:[:\s]\s|\s[:\s]))NL\s?\d{2}\s?[A-Z]{4}[0 ]\s?\d{9,10})|(?:(?<=IBAN[:\s])NL\s?\d{2}\s?[A-Z]{4}[0 ]\s?\d{9,10})


0 commentaires