首页 > 解决方案 > 用于德国税号的 Python 正则表达式

问题描述

我需要帮助来完成我的德国税号正则表达式。这些数字的格式取决于州。我几乎可以匹配所有的州。剩下的州只有黑森州和不来梅州。问题是,它们与其他号码(如电话号码)非常相似。我的演示中有一个完整的示例。

也许你可以帮助我,匹配所有相关的数字。

这是我的正则表达式:

(?:\d{3}\s?/\s?\d{3}\s?/\s?\d{5})|(?:\d{2}\s?/\s?\d{3}\s?/\s?\d{5})|(?:\d{3}\s?/\s?\d{4}\s?/\s?\d{4})|(?:\d{5}\s?/\s?\d{5}\b)|(\d{11})|(\d{10})

这些是为了完成所有状态的正则表达式而留下的关键模式:

Hessen: 02581580201
025 815 80201

Bremen: 7581508152
75 815 08152

标签: pythonregex

解决方案


您可以/在可选的空白字符之间进行匹配,也可以使用匹配空白字符(?:\s?/\s?|\s)

最后的部分可以缩短为\d{10,11}.

前 2 部分可以缩短为d{2,3}\s?/\s?\d{3}\s?/\s?\d{5}

\b(?:\d{2,3}(?:\s?/\s?|\s)\d{3}(?:\s?/\s?|\s)\d{5}|\d{3}(?:\s?/\s?|\s)\d{4}(?:\s?/\s?|\s)\d{4}|\d{5}(?:\s?/\s?|\s)\d{5}|\d{10,11})\b

解释

  • \b防止匹配成为更大单词的一部分的单词边界
  • (?:非捕获组
    • \d{2,3}(?:\s?/\s?|\s)\d{3}(?:\s?/\s?|\s)\d{5}匹配 2-3 位数字,然后是 3 位数字和 5 位数字
    • |或者
    • \d{3}(?:\s?/\s?|\s)\d{4}(?:\s?/\s?|\s)\d{4}匹配3位数、4位数和4位数
    • |或者
    • \d{5}(?:\s?/\s?|\s)\d{5}|\d{10,11}匹配 5 位数字、5 位数字和 10 位或 11 位数字
  • )关闭非捕获组
  • \b一个词的边界

正则表达式演示

如果数字之间的部分应该匹配,您还可以使用带有反向引用的捕获组来匹配第二部分中已经在第一部分中捕获的内容。


推荐阅读