2016-11-16 16 views
3

У меня есть таблицы с плохо образованными адресами в них, и мне нужно, чтобы они были достаточно хороши для геокодирования. Я пробовал некоторые из библиотек Python для парсинга адресов, но они не могут определить некоторые из них. В качестве примера,Используйте regex и python для перемещения города в адресный блок, добавьте амперсанд

«N Monon AVE FRANCESVILLE Вт ЖЕЛТАЯ СТ»

состояние для всех из них Индиана, который у меня нет проблем конкатенации в представленной строке. В приведенном выше примере, это пересечение, что геокодировщик действительно принимают как:

«N Monon AVE & W YELLOW ST FRANCESVILLE»

Мое мышление является то, что самый простой способ, чтобы найти первое слово после того, тип улицы (Ave, Dr, Ct и т. д.), переместите его до конца и добавьте амперсанд вместо него.

У меня есть этот код, который, вероятно, ужасно неэффективен, но он захватывает только первый тип улицы; в приведенном выше примере будет выводиться AVE.

/(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)[^(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)]/i 

То, что я не знаю, как сделать, это сказать ему, чтобы захватить все, что слово сразу после первого экземпляра типа улицы. Оттуда я должен использовать re.search и .group [n] для извлечения города и бросить в анализируемую строку.

+0

См https://regex101.com/r/Am033H/1 и http://ideone.com/UNgnAy. –

ответ

1

Вы можете использовать

rx = re.compile(r"(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)\s+(\S+)\s*(.*)", re.I) 

Смотрите regex demo

Добавка \s+(\S+)\s*(.*): 1+ 1+, пробелы, не являющиеся (пробелы (\S+), группа 2), 0+ (пробелы \s*) и любой 0+, кроме символов разрыва строки (.*, группа 3).

Python demo:

import re 
rx = re.compile(r"(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)\s+(\S+)\s*(.*)", re.I) 
s = "N MONON AVE FRANCESVILLE W YELLOW ST" 
result = re.sub(rx, r'\1 & \3 \2', s) 
print(result) 
+0

Замечательно! Я все еще пытаюсь собрать группы; re.sub достаточно силен. Я также пробовал это на несоответствующих адресах, чтобы убедиться, что он не испортил их, и он работал нормально. –

+0

Рад, что это сработало для вас. Пожалуйста, также подумайте над тем, чтобы мой ответ оказался полезным для вас (см. [Как повысить уровень переполнения стека?] (Http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)) , –

+0

Дайте мне знать, что означает «получить группы вниз», вы имеете в виду, что вам также нужно вернуть список групп? Это легко сделать с обратным вызовом внутри 're.sub'. –

1
import re 
s = "N MONON AVE FRANCESVILLE W YELLOW ST" 
regex = r"(.*) (Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St) ([A-Za-z]*) (.*)" 
result = re.sub(regex, r"\1 \2 & \4 \3", s, flags=re.I) 
print(result)