Найдите адрес улицы США в тексте (желательно с использованием регулярного выражения Python)
Отказ от ответственности: я очень внимательно читаю эту ветку: поиск по адресу в строке - Python или Ruby и многие другие ресурсы.
Пока у меня ничего не работает.
Более подробно вот что я ищу:
Правила смягчены, и я определенно не прошу идеальный код, который охватывает все случаи; только несколько простых базовых с предположениями, что адрес должен быть в формате:
а) номер улицы (1...N цифр);
б) название улицы: одно или несколько слов с большой буквы;
б-2) (необязательно) было бы лучше, если бы он мог иметь префикс с сокращением. "С.", "Н.", "Е.", "В."
в) (необязательно) единица / квартира / и т. д. может быть любым (включая пустое) числом произвольных символов
г) улица "тип": одна из ("ул.", "пр.", "путь");
e) название города: 1 или более заглавных слов;
е) (необязательно) аббревиатура штата (2 буквы)
g) (необязательно) почтовый индекс, который состоит из 5 цифр.
Ничто из вышеперечисленного не должно быть действительным (например, существующий город или почтовый индекс).
Я пытаюсь выражения, подобные этим до сих пор:
pat = re.compile (r '\ d {1,4} (\ w +) {1,5}, (. *), (\ w +) {1,5}, (AZ | CA | CO | NH), [0-9] {5} (- [0-9] {4})? ', Re.IGNORECASE)
>>> pat.search("123 East Virginia avenue, unit 123, San Ramondo, CA, 94444")
Не работай, и мне непросто понять почему. В частности: как я могу отделить в своем шаблоне группу любых слов от одного из конкретных слов, которые должны следовать, например, сокращенного состояния. или улица "типа" (ул., пр.)?
В любом случае: вот пример того, что я надеюсь получить: учитывая def ex_addr(текст): # re magiC# возвращает 1-й адрес (все адреса?) Или None, если ничего не найдено
for t in [
'The meeting will be held at 22 West Westin st., South Carolina, 12345 on Nov.-18',
'The meeting will be held at 22 West Westin street, SC, 12345 on Nov.-18',
'Hi there,\n How about meeting tomorr. @10am-sh in Chadds @ 123 S. Vancouver ave. in Ottawa? \nThanks!!!',
'Hi there,\n How about meeting tomorr. @10am-sh in Chadds @ 123 S. Vancouver avenue in Ottawa? \nThanks!!!',
'This was written in 1999 in Montreal',
"Cool cafe at 420 Funny Lane, Cupertino CA is way too cool",
"We're at a party at 12321 Mammoth Lane, Lexington MA 77777; Come have a beer!"
] print ex_addr(t)
Я хотел бы получить:
'22 West Westin st., South Carolina, 12345' '22 West Westin street, SC, 12345' '123 S. Vancouver ave. in Ottawa' '123 S. Vancouver avenue in Ottawa' None # for 'This was written in 1999 in Montreal', "420 Funny Lane, Cupertino CA", "12321 Mammoth Lane, Lexington MA 77777"
Не могли бы вы помочь?
2 ответа
\d{1,4}( \w+){1,5}, (.*), ( \w+){1,5}, (AZ|CA|CO|NH), [0-9]{5}(-[0-9]{4})?
В этом регулярном выражении у вас есть слишком много пробелов (до ( \w+){1,5}
, который уже начинается с одного). Удаляя его, он соответствует вашему примеру.
Я не думаю, что вы можете предположить, что там будет "блок 123" или что-то подобное, или их может быть несколько (например, "здание А, квартира 3"). Обратите внимание, что в вашем первоначальном регулярном выражении .
может соответствовать ,
что может привести к очень долгим (и нежелательным) матчам. Вы, вероятно, должны принять несколько таких групп с ограничением числа (например, заменить , (.*)
с чем-то вроде (, [^,]{1,20}){0,5}
,
В любом случае, вы, вероятно, никогда не получите что-то 100% точное, которое будет принимать любые изменения, которые люди могут бросить в них. Делай много тестов! Удачи.
Я только что наткнулся на это в GitHub, так как у меня похожая проблема. Кажется, работает и быть более надежным, чем ваше текущее решение.
https://github.com/madisonmay/CommonRegex
Глядя на код, регулярное выражение для адреса улицы учитывает еще много сценариев. '\d{1,4} [\w\s]{1,20}(?: улица | улица | просп. | пр. | дорога | дорога | шоссе | шоссе | площадь | кв | тропа | трл | проезд | др | суд | кт | Parkway| Пкви | круг | CIR | бульвар | бульв)\W (=\s|? $)"