用于提取德语地址格式的Python正则表达式解决方案

时间:2018-09-10 10:33:57

标签: python regex regular-language street-address

我正努力编写一个Python正则表达式代码来提取德语地址,如下所示。

Abc GmbH EnsisheimerStraße6-8 79346 Endingen

Def Gmbh Keltenstr。 16 77971 Kippenheim Deutschland

Ghi Deutschland Gmbh 53169波恩

Jkl Gmbh Ensisheimer Str。 6 -8 79346 Endingen

我编写了以下代码来提取单个地址组件,并将它们作为单个正则表达式组合在一起,但仍然无法检测到上述地址。有人可以帮我吗?

# TEST COMPANY NAME
string = 'Telekom Deutschland Gmbh 53169 Bonn Datum'
result = re.findall(r'([a-zA-Zäöüß]+\s*?[A-Za-zäöüß]+\s*?[A-Za-zäöüß]?)',string,re.MULTILINE)
print(result)

# TEST STREET NAME
result = re.findall(r'([a-zA-Zäöüß]+\s*\.)',string)
print(result)

# TEST STREET NUMBER
result = re.findall(r'(\d{1,3}\s*[a-zA-Z]?[+|-]?\s*[\d{1,3}]?)',string)
print(result)

# TEST POSTAL CODE
result = re.findall(r'(\d{5})',string)
print(result)

# TEST CITY NAME
result = re.findall(r'([A-Za-z]+)?',string)
print(result)

# TEST COMBINED ADDRESS COMPONENTS GROUP
result = re.findall(r'([a-zA-Zäöüß]+\s+?[A-Za-zäöüß]+\s+?[A-Za-zäöüß]+\s+([a-zA-Zäöüß]+\s*\.)+?\s+(\d{1,3}\s*[a-zA-Z]?[+|-]?\s*[\d{1,3}]?)+\s+(\d{5})+\s+([A-Za-z]+))',string)
print(result)

请注意,我的目标是,如果这些地址中的任何一个出现在文本的大段中,则正则表达式仅应提取并打印这些地址。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我会选择使用正则表达式解决方案,而使用libpostal,它具有其他两种语言的绑定(对于python,请使用postal)。您必须单独安装libpostal,因为它包含1.8GB的培训数据。

好处是,您可以按任何顺序将其分配给地址部分,大多数情况下它将选择正确的部分。 它使用机器学习,并以多种语言在OpenStreetMap数据上进行训练。

对于给出的示例,不一定需要从字符串中删除公司名称和国家/地区:

from postal.parser import parse_address
parse_address('Telekom Deutschland Gmbh 53169 Bonn Datum')

[('telekom deutschland gmbh', 'house'),
 ('53169', 'postcode'),
 ('bonn', 'city'),
 ('datum', 'house')]

parse_address('Keltenstr . 16 77971 Kippenheim')

[('keltenstr', 'road'),
 ('16', 'house_number'),
 ('77971', 'postcode'),
 ('kippenheim', 'city')]