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.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
【讨论】:
以上是关于IBAN 掩码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章