我正努力编写一个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)
请注意,我的目标是,如果这些地址中的任何一个出现在文本的大段中,则正则表达式仅应提取并打印这些地址。有人可以帮助我吗?
答案 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')]