Pandas str совпадение для немецких адресов - PullRequest
1 голос
/ 15 апреля 2020

У меня довольно неприятная проблема в разработке регулярного выражения для подготовки адресов для геокодирования с помощью Nominatim. Я работаю с немецкими адресами, которые выглядят так:

Von-der-Leyen-Platz 1 47506 Neukirchen-Vluyn    
Schildstraße 52531 Übach-Palenberg  
Finkenratherstraße Straße 4a 52134 Herzogenrath 
Format: Street Number Postal code City

Я хочу добиться того, чтобы первые литералы после номеров улиц не встречались. Для этого я использую следующее регулярное выражение:

(\d+).*?\s+(.+)

Это соответствует третьему адресу 4 52134 Герцогенрат. Но не на Финкенратерштрассе 4 52143 Герцогенрат. Другая проблема, которую я увидел, - это второй адрес, так как у него нет номера улицы. Вот почему я хотел отфильтровать создание регулярного выражения, которое может фильтровать следующую структуру:

Street name {number if available} Postal code (5 digits) City name

Почтовый код всегда состоит из 5 цифр, и структура всегда одинакова, просто иногда отсутствует номер улицы.

Есть ли способ, чтобы описать это как регулярное выражение?

1 Ответ

1 голос
/ 15 апреля 2020

Для ваших данных это может работать:

# sample data
s = pd.Series(['Von-der-Leyen-Platz 1 47506 Neukirchen-Vluyn',
               'Schildstraße 52531 Übach-Palenberg',
               'Finkenratherstraße Straße 4a 52134 Herzogenrath'])

# extract
s.str.extract(r'(?P<Street>\D+)\s?(?P<Number>\d+\S*)?\s(?P<Postal>\d{5})\s(?P<City>\D+)$')

Вывод:

                      Street Number Postal              City
0        Von-der-Leyen-Platz     1   47506  Neukirchen-Vluyn
1               Schildstraße    NaN  52531   Übach-Palenberg
2  Finkenratherstraße Straße    4a   52134      Herzogenrath
...