regex 为Swiss地址创建Python正则表达式

sauutmhj  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(74)

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

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...'

Regex应该只提取有关地址的信息。
我看了这篇文章: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”等,我只在寻找一些城市(但后来我可能会添加更多)。
我的问题是,我不知道如何把所有这些放在一个正则表达式中。
你能告诉我如何使regex将识别瑞士地址。

i86rm4rw

i86rm4rw1#

类似于:(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)。所以请随意指出该车道的规则。

相关问题