Регекс для маски IBAN - PullRequest
       2

Регекс для маски IBAN

1 голос
/ 17 марта 2019

Я пытаюсь извлечь этот текст "NL dd ABNA ddddddddd" из строки:

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

И эта строка может иметь три или более вариаций.

Все же я только пришел к этому:

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

Что соответствует первым двум примерам, но не третьему.

См .: https://regex101.com/r/zGDXa2/1.

Как мне это лечить?

Ответы [ 4 ]

3 голосов
/ 17 марта 2019

Проблема в вашей демонстрации regex101 заключается в том, что в вашем регулярном выражении есть дополнительный символ после $, поэтому удалите его и измените 0 на [0 ], и это исправит все и начнет совпадать и с третьей строкой. Правильное регулярное выражение становится,

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

Проверьте обновленную демоверсию

1 голос
/ 18 марта 2019

Вы можете использовать следующее регулярное выражение:

(?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})

демо

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

Если вы работаете в Python, вы можете удалить (?:i) и заменить его на флаг re.I или re.IGNORECASE

Проверено на:

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

Выдержки:

NL 11abna0317164300
NL21ABNA0417134300
NL 29 ABNA 401422366
NL 39 ABNA 0822416395
NL 39 ABNA 0822416395
0 голосов
/ 17 марта 2019

Это не то, что вы хотите, но работает.

IBAN имеет строгий формат, поэтому лучше его нормализовать, а затем просто вырезать часть, потому что все будет соответствовать регулярному выражению, например:

КОД

#!/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:])

ВЫХОД

91 0417463300
91 0417164300
69 402032566

Это не регулярное выражение, но должно работать быстрее, но если вы знаете, какчтобы нормализоваться лучше, помогите пожалуйста.

0 голосов
/ 17 марта 2019

Вы можете просто удалить все пробелы и сделать прописные буквы остальными, например:

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

И тогда ваше регулярное выражение будет:

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

Это работает в https://regex101.com/r/zGDXa2/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...