使用 Python 从文本中提取 IBAN

PPa*_*ker 6 python regex pattern-matching iban

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

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

^DE([0-9a-zA-Z]\s?){20}$
Run Code Online (Sandbox Code Playgroud)

我在stackoverflow上看到过类似的问题。但是,编写 IBAN 数字的不同方法以及从文本中提取这些数字的组合使我的问题很难解决。

希望你能帮我解决这个问题!

Wik*_*żew 1

一般来说,要匹配德国和奥地利的IBAN代码,您可以使用

codes = re.findall(r'\b(DE(?:\s*[0-9]){20}|AT(?:\s*[0-9]){18})\b(?!\s*[0-9])', text)
Run Code Online (Sandbox Code Playgroud)

细节

  • \b- 字边界
  • (DE(?:\s*[0-9]){20}|AT(?:\s*[0-9]){18})- 第 1 组:DE重复 20 次数字,中间有任意数量的空格,或者AT然后重复 18 次单个数字,最终用任意数量的空格分隔
  • \b(?!\s*[0-9])- 后面不紧接着零个或多个空格和 ASCII 数字的字边界。

请参阅此正则表达式演示

对于您在问题中显示的包含不正确的 IBAN 代码的数据,您可以使用

\b(?:DE|AT)(?:\s?[0-9a-zA-Z]){18}(?:(?:\s?[0-9a-zA-Z]){2})?\b
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示细节

  • \b- 字边界
  • (?:DE|AT)-DE或者AT
  • (?:\s?[0-9a-zA-Z]){18} - 出现十八次可选空格,然后是字母数字字符
  • (?:(?:\s?[0-9a-zA-Z]){2})?- 可选出现两个可选空格和字母数字字符序列
  • \b- 单词边界。

  • 温馨提示,但 IBAN 号码只能包含 ISO 代码以后的号码。您可能会在此处返回误报,包括超过 18 位的奥地利 IBAN 号码。 (3认同)