【问题标题】:Regex for IBAN maskIBAN 掩码的正则表达式
【发布时间】:2019-08-08 04:30:06
【问题描述】:

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

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

我该如何治疗?

【问题讨论】:

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

标签: python regex


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    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?\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
        

        【讨论】:

          猜你喜欢
          • 2017-04-11
          • 1970-01-01
          • 2017-11-23
          • 2014-06-17
          • 1970-01-01
          • 2021-04-26
          • 2013-04-16
          • 1970-01-01
          相关资源
          最近更新 更多