regex IBAN掩码正则表达式

irlmq6kh  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(158)

我试图从字符串集合中提取文本“NL dd ABNA dddddddd”,我需要创建与第三个标题匹配的表达式:

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.
我该怎么治疗呢?

2ul0zpep

2ul0zpep1#

你的regex101演示中的问题是,在你的正则表达式中$后面有一个额外的字符,所以删除它,并将0改为[0 ],这样就解决了所有问题,并开始匹配你的第三行。正确的正则表达式变成,

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

xt0899hw

xt0899hw2#

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

(?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
g2ieeal7

g2ieeal73#

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

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

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

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

它在https://regex101.com/r/zGDXa2/1中工作

3vpjnl9f

3vpjnl9f4#

这不是你想要的,但很管用。
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

这不是正则表达式,但应该工作得更快,但如果你知道如何更好地规范化,请帮助它。
您可以看到源代码here

相关问题