Выделить название улицы из строки адреса в python
Есть таблица с перечнем адресов заведений общепита, из которой нужно получить только название улицы. Адреса бывают такие:
город Москва, Лесная улица, дом 20, строение 1
город Москва, поселение Московский, деревня Лапшинка, владение 8, корпус 1
город Москва, город Щербинка, Варшавское шоссе, 28-й километр, владение 8, строение 1
город Москва, город Московский, улица Хабарова, дом 2
город Москва, поселение Марушкинское, деревня Марушкино, Полевая улица, дом 16
город Москва, город Зеленоград, корпус 1805
город Москва, Зеленоградская улица, дом 11
город Москва, город Зеленоград, Никольский проезд, дом 5
город Москва, город Зеленоград, Яблоневая аллея, дом 2
город Москва, город Зеленоград, проезд № 4922, дом 4, строение 5
город Москва, поселение Вороновское, посёлок ЛМС, микрорайон "Центральный", дом 34, строение 1
город Москва, 80-й километр Московской Кольцевой Автодороги, дом 4, строение 1
город Москва, проектируемый проезд № 4062, дом 6, строение 16
город Москва, город Зеленоград, проезд № 4801, дом 3, строение 1
город Москва, Проектируемый проезд N 5231, дом 8, строение 3
Как лучше выделить только улицу? Есть такой код, он работает в простых случаях, но не работает в большинстве примеров выше:
pattern = '\,*,(([а-яА-Я1-9\-ё\s"]+)?(улица|переулок|шоссе|проспект|площадь|проезд|село|Проезд|аллея|бульвар|набережная|тупик|линия|)([а-яА-Яё1-9\-\s"]+)?)\,'
df['street'] = df['address'].str.extract(pat = pattern)[0]
Возвращает, например, поселение Московский или город Московский, а нужно улица Хабарова.
Пробовал через api яндекс геокодера, но там аналогичные сложности, описанные в вопросе тут.
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте так:
words = ['улица','ул','переулок','шоссе','проспект','площадь','проезд',
'село','аллея','бульвар','набережная','тупик','линия']
str_pat = r".*,\s*\b([^,]*?(?:{})\b[^,]*)[,$]+".format("|".join(words))
df["street"] = df["addr"].str.extract(str_pat, flags=re.I)
результат:
In [62]: df["street"]
Out[62]:
0 Лесная улица
1 NaN
2 Варшавское шоссе
3 улица Хабарова
4 Полевая улица
5 NaN
6 Зеленоградская улица
7 Никольский проезд
8 Яблоневая аллея
9 проезд № 4922
10 NaN
11 NaN
Name: street, dtype: object