正则表达式提取(德国)街道号

时间:2018-02-05 13:28:00

标签: regex

我有以下街道星座:

|               Street name               | extracted value |
| --------------------------------------- | --------------- |
| Lilienstr. 12a                          | 12a             |
| Hagentorwall 3                          | 3               |
| Seilerstr. 14 (Eingang Birkenstr.)      | 14              |
| Guentherstr. 43 B                       | 43 B            |
| Eberhard-Leibnitz Str. 1 WH 5B 241      | 1               |
| 1019-1781 Borderlinx C/O SEKO Logistics |        -        |

我的Regex部分正常工作(https://regex101.com/r/KumamP/2):

\d+(?:[a-zA-Z]$|\s[a-zA-Z]$)?

有人为我提供了更好的解决方案吗? Eberhard-Leibnitz Str.只能给我一个结果或没有结果。 1019-1781 Borderlinx C/O SEKO Logistics应该没有给我任何结果。

2 个答案:

答案 0 :(得分:1)

以下正则表达式适用于您的示例

^[ \-a-zA-Z.]+\s+(\d+(\s?\w$)?)

https://regex101.com/r/KumamP/4

基本假设(如您的样本所示),有效的街道星座"总是以街道名称开头,然后是街道/门牌号码。

如果有Straße des 17. Juni 1

这样的条目,下一个正则表达式也可以正常工作
^[ \-0-9a-zA-ZäöüÄÖÜß.]+?\s+(\d+(\s?[a-zA-Z])?)\s*(?:$|\(|[A-Z]{2})

https://regex101.com/r/KumamP/5

但正如评论员已经写过的那样,很难通过数字街道名称部分和街道号码之间的正则表达来区分。如果你允许"未指明"甚至更多您的示例中的后缀如(Eingang Birkenstr.)WH 5B 241

答案 1 :(得分:0)

解析地址行并非易事。许多国家都有自己的特殊规则,德国和奥地利真的很棘手。

为了更好地理解您提供的示例,有一个特别说明了这一点:

“Eberhard-Leibnitz Str. 1 WH 5B 241”

这里的“WH”代表“Wohnung”,但他们通常只使用“W”(并使用一些分隔符,如“//”)。所以它会更像是: "Eberhard-Leibnitz Str. 1 // W 5B 241"

“co”或“c/o”或“z.H”(“zu Händen von”的缩写)也很常见。和它后面的任何内容,它只是邮箱的名称。

最后但并非最不重要的一点是,地址行还可以包含邮政编码 + 城市名称。取决于您正在与之交互的 API,或者它是否是用户输入(那么它可能会变得非常疯狂!)。

因此,要正确解析地址行,您应该首先通过删除额外信息来规范化它们。然后你可以使用正则表达式。看看这个宝石:https://github.com/matiasalbarello/address_line_divider

有关该主题的一些不错的读物: