Выделить название улицы из строки адреса в 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
→ Ссылка