我正在尝试过滤街道名称并获取我想要的部分。这些名称有多种格式。这里有一些例子以及我想从他们那里得到什么。

Car Cycle 5 B Ap 1233       < what I have
Car Cycle 5 B               < what I want

Potato street 13 1 AB       < what I have
Potato street 13            < what I want

Chrome Safari 41 Ap 765     < what I have
Chrome Safari 41            < what I want

Highstreet 53 Ap 2632/BH    < what I have
Highstreet 53               < what I want

Something street 91/Daniel  < what I have
Something street 91           < what I want

通常我想要的是街道名称(1-4 个名字),如果有的话,后面跟着街道号码,如果有的话,然后是街道字母(1 个字母)。我只是无法让它正常工作。

这是我的代码(我知道,这很糟糕):

import re

def address_regex(address):
    regex1 = re.compile("(\w+ ){1,4}(\d{1,4} ){1}(\w{1} )")
    regex2 = re.compile("(\w+ ){1,4}(\d{1,4} ){1}")
    regex3 = re.compile("(\w+ ){1,4}(\d){1,4}")
    regex4 = re.compile("(\w+ ){1,4}(\w+)")

    s1 = regex1.search(text)
    s2 = regex2.search(text)
    s3 = regex3.search(text)
    s4 = regex4.search(text)

    regex_address = ""

    if s1 != None:
        regex_address = s1.group()
    elif s2 != None:
        regex_address = s2.group()
    elif s3 != None:
        regex_address = s3.group()
    elif s4 != None:
        regex_address = s4.group()
    else:
        regex_address = address

    return regex_address

我正在使用 Python 3.4

最佳答案

我将在这里冒险并假设在你的最后一个例子中你实际上想要捕获数字 91,因为不这样做是没有意义的。

这是一个解决方案,可以捕获您的所有示例(以及您的最后一个示例,但包括 91):

^([\p{L} ]+ \d{1,4}(?: ?[A-Za-z])?\b)
  • ^ 在字符串
  • 的开头开始匹配
  • [\p{L} ]+ 属于“字母”类别的空格或 unicode 字符的字符类,1-无穷次
  • \d{1,4} 数,
  • 的 1-4 倍
  • (?: ?[A-Za-z])? 非捕获组可选空格和单个字母,0-1 次

  • 捕获组 1 是整个地址。我不太明白你分组背后的逻辑,但你可以随意分组。

    See demo

    关于python - 正则表达式 python 不会像我想要的那样工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32070890/

    10-12 12:23