首页 > 解决方案 > 使用 Python 从文本中提取 IBAN

问题描述

我想用 Python 从文本中提取 IBAN 号码。这里的挑战是,IBAN 本身可以以多种方式编写,数字之间有空格,我发现很难将其翻译成有用的正则表达式模式。

我编写了一个演示版本,它试图匹配文本中的所有德国和奥地利 IBAN 号码。

^DE([0-9a-zA-Z]\s?){20}$

我在stackoverflow上看到过类似的问题。然而,编写 IBAN 数字的不同方法的组合以及从文本中提取这些数字,使得解决我的问题变得非常困难。

希望你能帮助我!

标签: pythonregexpattern-matchingiban

解决方案


ISO地码 确认# 银行# 帐户#
德国 2a 2n 8n 10n
奥地利 2a 2n 5n 11n

注意: a - 字母(仅限字母),n - 数字(仅限数字)

所以主要区别实际上是数字的长度。这意味着您可以尝试:

\b(?:DE(?:\s*\d){20}|AT(?:\s*\d){18})\b(?!\s*\d)

请参阅在线演示


  • \b- 字边界。
  • (?:- 打开第一个非捕获组。
    • DE- 从字面上匹配大写“DE”。
    • (?:- 打开第二个非捕获组。
      • \s*\d- 零个或多个空格,最多一位数。
      • ){20}- 关闭第2个非捕获组并匹配20次。
    • |- 或者:
    • AT- 从字面上匹配大写“AT”。
    • (?:- 打开第三个非捕获组。
      • \s*\d- 零个或多个空格,最多一位数。
      • ){18}- 关闭第2个非捕获组并匹配20次。
    • )- 关闭第一个非捕获组。
  • \b- 字边界。
  • (?!\s*\d)- 负前瞻以防止任何尾随数字。

它确实表明您的奥地利 IBAN 号码无效。如果您希望提取到它们仍然有效的程度,我想您可以删除\b(?!\s*\d)


推荐阅读