为瑞士地址创建Python正则表达式

2024-05-12 05:03:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想制作能够识别瑞士官方邮政地址的正则表达式。它们看起来像这样:

Mr
Hans Schweizer
Gerechtigkeitsgasse 10
3011 Berne

Ms
Susi Frei
c/o Hans Schweizer
Gerechtigkeitsgasse 10
3011 Berne 

Mr
Erich Müller
Bahnhofstrasse 4/8
8001 Zurich

从文本中可以看出:

'You should send a letter to: 
    Mr
    Hans Schweizer
    Gerechtigkeitsgasse 10
    3011 Berne

and tell him all about your last summer...'

正则表达式应该只提取有关地址的信息

我看了这篇文章: FInd a US street address in text (preferably using Python regex)

并试图模仿它,但我失败了,我无法让它工作

地址应包括:

gender (Herr|Frau|Mrs|Mr|Ms)
name: two or 3 string titled words
street: (strasse|gasse|weg|platz|promenade)
code: int numbers
city: (Zurich|Zürich|Basel|Geneva|Lausanne|Bern|Winterthur|Lucerne|St. Gallen|St.Gallen)

因此,瑞士95%的街道都有后缀“strasse”或“gasse”等,我只寻找一些城市(但稍后我可能会添加更多)

我的问题是,我不知道如何将所有这些放在一个正则表达式中

你能告诉我如何制作能够识别瑞士地址的正则表达式吗


Tags: street官方地址ms邮政stmrzurich
1条回答
网友
1楼 · 发布于 2024-05-12 05:03:34

比如: (Herr|Frau|Mrs|Mr|Ms)\n([a-zA-Zü]+ ){1,2}[a-zA-Zü]+\n[a-zA-Zü]+(strasse|gasse|weg|platz|promenade) ([0-9]{1,4}|[0-9]{1,4}/[0-9]{1,4})\n[0-9]{1,4} (Zurich|Zürich|Basel|Geneva|Lausanne|Bern|Winterthur|Lucerne|St. Gallen|St.Gallen)

如果你想了解更多信息,请尽管问。也许有什么不对劲 不要忘记我在哪里使用[a-zA-Z]+添加所有重音字符等

以下是有关如何检查的示例代码:

import re

pattern = "(Herr|Frau|Mrs|Mr|Ms)\n([a-zA-Zü]+ ){1,2}[a-zA-Zü]+\n[a-zA-Zü]+(strasse|gasse|weg|platz|promenade) ([0-9]{1,4}|[0-9]{1,4}/[0-9]{1,4})\n[0-9]{1,4} (Zurich|Zürich|Basel|Geneva|Lausanne|Bern|Winterthur|Lucerne|St. Gallen|St.Gallen)"


test1 = "Mr\nHans Schweizer\nGerechtigkeitsgasse 10/4657\n3011 Bern"
test2 = "Ms\nSusi Frei\nc/o Hans Schweizer\nGerechtigkeitsgasse 10\n3011 Berne"
test3 = "Mr\nErich Müller\nBahnhofstrasse 4/8\n8001 Zurich"
test4 = "this is bad :("
test5 = "Mr\nErich Müller\nBahnhofstrasse 444db\n8001 Zurich"
test6 = "Hans Schweizer\nGerechtigkeitsgasse 10\n3011 Berne"

res = re.fullmatch(pattern, test1)
print("test1:")
print(res != None)

res = re.fullmatch(pattern, test2)
print("\ntest2:")
print(res != None)

res = re.fullmatch(pattern, test3)
print("\ntest3:")
print(res != None)

res = re.fullmatch(pattern, test4)
print("\ntest4:")
print(res != None)


res = re.fullmatch(pattern, test5)
print("\ntest5:")
print(res != None)

res = re.fullmatch(pattern, test6)
print("\ntest6:")
print(res != None)

具有以下输出(测试4、5和6为错误文本):

test1:
True

test2:
False

test3:
True

test4:
False

test5:
False

test6:
False

您的第二个示例不起作用,因为与其他示例相比,还有一条车道,并且您在解释中没有提到它(c/o Hans Schweizer)。因此,请随意指出该车道的规则

相关问题 更多 >