使用 Python 正则表达式从字符串中提取门牌号和街道名称

Extract House Number and Street Name from string using Python Regex

我是 Regex 的新手,我正在尝试使用它来将地址解析为门牌号和街道。

示例:123 Main St --> ['123', 'Main St']

由于我的一些街道字符串会有带连字符的街道地址,这让事情变得有点复杂,在这种情况下,我想在连字符之前取第一个数字。

示例:123-127 Main St --> ['123', 'Main St']

最后,我需要能够处理以数字开头的街道名称。

最复杂的示例是:123-127 3rd Ave --> ['123', '3rd Ave']

到目前为止,我已经能够提取街道号码,包括在带连字符的情况下,但我不确定如何提取匹配街道号码模式后出现的街道名称。

MyString='123-127 Main St'
StreetNum=digit=re.findall('(^\d+)', MyString)

感谢您的帮助!

我还在编辑问题以指出破折号不是唯一可以用两个数字分隔街道的字符。数据中出现了三种情况:

1) 123-127 第五街

2) 123 1/2 第五街

3) 123 & 125 第五街

在所有这 3 种情况下,结果应该是 123 5th St.

我假设地址部分必须在最后,并且恰好有两个字。

>>> s = '123-127 Main St'
>>> re.findall(r'^\d+|\S+ +\S+$', s)
['123', 'Main St']
>>> re.findall(r'^\d+|\S+ +\S+$', "123-127 3rd Ave")
['123', '3rd Ave']

\S+ 匹配一个或多个非 space 字符。

通过re.split函数,

>>> s = '123-127 Main St'
>>> re.split(r'(?<=\d)(?:-\d+)?\s+', s)
['123', 'Main St']
>>> re.split(r'(?<=\d)(?:-\d+)?\s+', "123 Main St")
['123', 'Main St']
>>> re.split(r'(?<=\d)(?:-\d+)?\s+', "123-127 3rd Ave")
['123', '3rd Ave']
(\d+)(?:-\d+(?=\s))?\s(.*)

捕获第一个数字,跳过破折号和下一个数字(如果存在),然后捕获 space.

之后的所有内容
>>> re.match(r'(\d+)(?:-\d+(?=\s))?\s(.*)', '123-127 3rd Ave').groups()
('123', '3rd Ave')

希望这就是您要找的:

(\d+).*?\s+(.+)