IBAN 掩码的正则表达式

Posted

技术标签:

【中文标题】IBAN 掩码的正则表达式【英文标题】:Regex for IBAN mask 【发布时间】:2019-08-08 20:41:13 【问题描述】:

我正在尝试从字符串中提取此文本“NL dd ABNA dddddddddd”:

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

并且该字符串可能有三个或更多变体。

然而我只是想到了这个:

NL\s?\d2\s?[A-Z]40\s?\d9$

与前两个示例匹配,但与第三个不匹配。

请参阅:https://regex101.com/r/zGDXa2/1。

我该如何治疗?

【问题讨论】:

请在问题中输入minimal reproducible example 为什么不删除所有的空格?这将使正则表达式更容易。在python中你可以做sentence = ' hello apple'sentence.replace(" ", "") 我也会将字符串大写,这样您就可以避免在正则表达式中包含小写字母。只需使用` sentence.upper()` 试试这个 NL。*\d9$ regex101.com/r/f9JVP2/4 你想要的输出是什么? 【参考方案1】:

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

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

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

NL\d2ABNA(\d10|\d9)

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

【讨论】:

【参考方案2】:

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

NL\s?\d2\s?[A-Z]4[0 ]\s?\d9$

Check your updated demo

【讨论】:

【参考方案3】:

这不是你想要的,但有效。

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

这不是一个正则表达式,但应该工作得更快,但如果你知道如何更好地规范化,请帮忙。

可以看源码here。

【讨论】:

【参考方案4】:

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

(?i)(?:(?<=IBAN(?:[:\s]\s|\s[:\s]))NL\s?\d2\s?[A-Z]4[0 ]\s?\d9,10)|(?:(?<=IBAN[:\s])NL\s?\d2\s?[A-Z]4[0 ]\s?\d9,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

【讨论】:

以上是关于IBAN 掩码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

IBAN 正则表达式包括空格和破折号

IBAN正则表达式(所有IBAN)

正则表达式来掩盖 IBAN

IBAN 正则表达式设计 [重复]

正则表达式从 IBAN 捕获 BBAN?

IBAN 的正则表达式允许空格并检查确切长度