我正在尝试从字符串中提取此文本“ 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。
我该怎么治疗?
答案 0 :(得分:3)
您的regex101演示中的问题是,$
之后的正则表达式中有一个多余的字符,因此请将其删除并将0
更改为[0 ]
,这将解决所有问题并开始与您的第三个匹配行。正确的正则表达式变为
NL\s?\d{2}\s?[A-Z]{4}[0 ]\s?\d{9}$
答案 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.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
答案 2 :(得分:0)
您可以删除所有空格,其余全部大写,如下所示:
iban = NL 91ABNA0417463300
iban.replace(" ", "")
iban.upper()
然后您的正则表达式将是:
NL\d{2}ABNA(\d{10}|\d{9})
答案 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
这不是正则表达式,但是应该可以更快地运行,但是如果您知道如何更好地规范化,请提供帮助。