IBAN面膜的正则表达式

时间:2019-03-17 18:42:16

标签: python regex

我正在尝试从字符串中提取此文本“ 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 个答案:

答案 0 :(得分:3)

您的regex101演示中的问题是,$之后的正则表达式中有一个多余的字符,因此请将其删除并将0更改为[0 ],这将解决所有问题并开始与您的第三个匹配行。正确的正则表达式变为

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

Check your updated demo

答案 1 :(得分:1)

您可以使用以下正则表达式:

(?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.Ire.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

答案 2 :(得分:0)

您可以删除所有空格,其余全部大写,如下所示:

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

然后您的正则表达式将是:

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

它适用于https://regex101.com/r/zGDXa2/1

答案 3 :(得分:0)

这不是您想要的,但是可以。

IBAN具有严格的格式,因此最好对其进行归一化,然后仅剪切一部分,因为所有内容都将匹配regexp,例如:

代码

#!/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

这不是正则表达式,但是应该可以更快地运行,但是如果您知道如何更好地规范化,请提供帮助。