用于分割街道地址的正则表达式,该地址可能具有末尾带有斜线或连字符的可选数字

Oll*_*_mc 0 regex python-3.x

我尝试读取街道地址并用正则表达式分割街道和号码。

该地址可以如下所示:

Ebory Mebory Street 1
Eborymebory Street 23/2
Filler Filler Filler Street 1-32
Run Code Online (Sandbox Code Playgroud)

我尝试拆分字符串使用split(),然后再次将街道名称放在一起(如果在拆分字符串中没有检测到数字)。

这仅适用于第一种情况。我认为如果我使用正则表达式会更好。问题是我对正则表达式的理解非常有限。

adress = "Ebory mebory Street 23".split()
street = ""
number = ""
for item in adress:
  if(not(item.isdigit())):
     street = street + item + " "
  else:
     number = item
Run Code Online (Sandbox Code Playgroud)

我得到的结果是正确的,但仅限于这种情况。如果地址是Eborymebory Street 23/24,则由于斜杠而无法工作。

那么,问题是如何获取街道地址以及字符串末尾的数字,并记住这些数字可能是可选的?

Wik*_*żew 6

您可以使用正则表达式,例如

(.*?)\s*(\d+(?:[/-]\d+)?)?$
Run Code Online (Sandbox Code Playgroud)

请参阅regex 演示Regulex 演示

在此输入图像描述

细节

  • (.*?)- 捕获组 1:除换行符之外的任何 0+ 字符,尽可能少
  • \s*- 0+ 空格
  • (\d+(?:[/-]\d+)?)?- 可选捕获组 2:1 个以上数字,然后是可选的/or -( [/-]) 序列,后跟 1 个以上数字
  • $- 字符串末尾。

请参阅Python演示re.match(它使模式仅在字符串的开头匹配):

import re
addresses = ["Ebory Mebory Street 1",
    "Eborymebory Street 23/2",
    "Filler Filler Filler Street 1-32",
    "Filler Filler Filler Street"]
for address in addresses:
    street = ""
    number = ""
    m = re.match(r"(.*?)\s*(\d+(?:[/-]\d+)?)?$", address)
    if m:
        street, number = m.groups()
        if not number:
            number = ""
        print("Address: {}\nStreet: {}\nNumber: {}".format(address, street, number))
Run Code Online (Sandbox Code Playgroud)

输出:

Address: Ebory Mebory Street 1
Street: Ebory Mebory Street
Number: 1
Address: Eborymebory Street 23/2
Street: Eborymebory Street
Number: 23/2
Address: Filler Filler Filler Street 1-32
Street: Filler Filler Filler Street
Number: 1-32
Address: Filler Filler Filler Street
Street: Filler Filler Filler Street
Number: 
Run Code Online (Sandbox Code Playgroud)