Regex: сопоставить только название улицы в пределах адреса - PullRequest
0 голосов
/ 11 октября 2018

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

2038 W MAIN AVE
2038QWEW S JEFFERSON AVENUE
33 NORTH CALIFORNIA STREET
53371 SOUTH WASHINGTON
53371 S WASHINGTON AVENUE
1600 E PENNSYLVANIA AVE
WEST9 67ST ST
E171 N 23RD STREET
G171 N121ST STREET

должен вернуть

MAIN
JEFFERSON
CALIFORNIA
WASHINGTON
WASHINGTON
PENNSYLVANIA
67ST
23RD
121ST

Пока у меня есть

([^ W ]|[^ E ]|[^ S ]|[^ N ])([0-9])*([A-Z]+)[^ ]

Но я не могу захватить только первый матччто происходит после номера улицы.Я чувствую, что мне нужны стандартные жадные операторы (то есть ?, * или +), но я не могу понять, как их включить.

Эти две ссылки сблизили меня:

Соответствует при каждом втором появлении

Простое регулярное выражение для адреса улицы

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

Регулярные выражения не являются хорошим инструментом для разделения почтовых адресов на поля.Например, в «Авеню Америк» «Авеню» - это название улицы или тип улицы?Или на «Северном полюсе», «Север» - это направление или название улицы?Кроме того, если присутствуют какие-либо орфографические ошибки, как это всегда бывает с адресами, синтаксический анализ на основе правил становится невозможным.

Чтобы надежно разделить адреса на поля, вам необходим инструмент стандартизации адресов.Компания, в которой я работаю, делает адрес .

0 голосов
/ 11 октября 2018

Для вывода, который вы хотите получить из заданного (адресного) ввода, это регулярное выражение наверняка поможет: [\ pL \ pN] + (? = \ H + [\ pL \ pN] + $)

Это регулярное выражение будет соответствовать второму последнему слову в вашей строке, где слово "1 или более любой буквы или цифры на любом языке".

Для справки вы можетеhttps://superuser.com/questions/1361759/matching-second-last-word-in-sentence-through-regular-expression

0 голосов
/ 12 октября 2018

Я смог понять это немного по-другому

[0-9A-Z]* [0-9A-Z]*$

, а затем я просто разделил строку, созданную пробелом.Может быть, один или два шага слишком много, но это прозрачно

0 голосов
/ 11 октября 2018

Логика: ищем второе последнее слово (набор символов) + возможная граница с символом N

^.*?\s[N]{0,1}([-a-zA-Z0-9]+)\s*\w*$

Res:

Match 1
Full match  0-15    `2038 W MAIN AVE`
Group 1.    7-11    `MAIN`
Match 2
Full match  16-43   `2038QWEW S JEFFERSON AVENUE`
Group 1.    27-36   `JEFFERSON`
Match 3
Full match  44-70   `33 NORTH CALIFORNIA STREET`
Group 1.    53-63   `CALIFORNIA`
Match 4
Full match  71-93   `53371 SOUTH WASHINGTON`
Group 1.    83-93   `WASHINGTON`
Match 5
Full match  94-119  `53371 S WASHINGTON AVENUE`
Group 1.    102-112 `WASHINGTON`
Match 6
Full match  120-143 `1600 E PENNSYLVANIA AVE`
Group 1.    127-139 `PENNSYLVANIA`
Match 7
Full match  144-157 `WEST9 67ST ST`
Group 1.    150-154 `67ST`
Match 8
Full match  158-176 `E171 N 23RD STREET`
Group 1.    165-169 `23RD`
Match 9
Full match  177-195 `G171 N121ST STREET`
Group 1.    183-188 `121ST`

https://regex101.com/r/m2rmUQ/4

...