我有以下街道星座:
| 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
应该没有给我任何结果。
答案 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
有关该主题的一些不错的读物: