正则表达式:仅匹配地址中的街道名称

Regex: Match only street name within address

我有一个地址列表,我想要一个正则表达式,它能够仅捕获街道名称,而不包含街道类型、地址编号或主要方向。格式有一些错误,但所有字符都是大写字母。所以,

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

应该return

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

到目前为止我已经

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

但我似乎无法只捕获街道号码后出现的第一个匹配项。我觉得我需要标准的贪婪运算符(即 ?*+),但我不知道如何合并它们。

这两个链接让我很接近:

Matching on every second occurence

Simple regex for street address

逻辑:我们正在寻找倒数第二个单词(字符集)+可能带有符号 N

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

回复:

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

对于给定(地址)输入的输出,此正则表达式肯定会有所帮助:[\pL\pN]+(?=\h+[\pL\pN] +$)

此正则表达式将匹配您行中的倒数第二个单词,其中一个单词是“1 个或多个任何语言的任何字母或数字”。

作为参考,您可以https://superuser.com/questions/1361759/matching-second-last-word-in-sentence-through-regular-expression

我能够以稍微不同的方式解决这个问题

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

然后我简单地拆分它由 space 创建的字符串。也许一两步太多了,但它是透明的