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?
4 Réponses :
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
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}$
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 .
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})
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 ?