Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式python无法按照我的要求工作_Python_Regex - Fatal编程技术网

正则表达式python无法按照我的要求工作

正则表达式python无法按照我的要求工作,python,regex,Python,Regex,我正在尝试筛选街道名称并获得我想要的部分。这些名称有几种格式。这里有一些例子,我想从中得到什么 第5轮B Ap 1233赛车

我正在尝试筛选街道名称并获得我想要的部分。这些名称有几种格式。这里有一些例子,我想从中得到什么

第5轮B Ap 1233赛车<我拥有的
自行车5b<我想要的
马铃薯街13 1 AB<我有什么
土豆街13<我想要什么
Chrome Safari 41 Ap 765<我拥有的
Chrome Safari 41<我想要什么
Highstreet 53 Ap 2632/BH<我所拥有的
我想要什么
街上的某物91/丹尼尔<我有什么
我想要的东西
通常我想要的是街道名称(1-4个名称),如果有街道编号,则后跟街道编号,如果有街道编号,则后跟街道字母(1个字母)。我就是不能让它正常工作

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

重新导入
def地址\正则表达式(地址):
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(文本)
s2=regex2.search(文本)
s3=regex3.search(文本)
s4=regex4.搜索(文本)
regex_address=“”
如果s1!=无:
regex_address=s1.group()
elif s2!=无:
regex_address=s2.group()
elif s3!=无:
regex_address=s3.group()
elif s4!=无:
regex_address=s4.group()
其他:
regex_address=地址
返回正则表达式地址

我使用的是Python 3.4,这适用于您提供的5个示例

^([a-z]+\s+)*(\d*(?=\s))?(\s+[a-z])*\b

将多行模式和大小写不敏感设置为on。如果您的正则表达式支持它,这就是(?im)。

也许您喜欢可读性更强的Python版本(没有正则表达式):

输出:

车辆循环5 B
马铃薯街13号
Chrome Safari 41
高街53号
某物街

在这里,我要做一个简单的假设,在你的最后一个例子中,你真的想抓住数字91,因为不抓住它是没有意义的

下面是一个解决方案,它包含了您的所有示例(以及最后一个示例,但包括91个示例):

  • ^
    在字符串开头开始匹配
  • [\p{L}]+
    属于“字母”类别的空格或unicode字符的字符类,1-无限次
  • \d{1,4}
    数字,1-4次
  • (?:?[A-Za-z])?
    可选空格和单个字母的非捕获组,0-1次
捕获组1是整个地址。我不太明白分组背后的逻辑,但请随意分组


只需使用像kodos这样的正则表达式工具。你不想要上一个例子中的数字91?上一个例子的逻辑是什么<代码>某物街91/丹尼尔为什么不接受91?那是个错误,我的错。我现在改了。谢谢你,这个效果好多了,但是有时候街名上没有数字(我不好忘了提这个),然后正则表达式就什么也得不到了。“土豆街”就是一个例子,它一无所获。那么我该怎么办呢?你们拥有的相互依赖的可选内容越多,你们增加的复杂性就越大。您可以尝试这个改进的版本,我不会进一步解释它,只说它更健壮:
^(\p{L}[\p{L}-]*\p{L}(?:\d{1,4}(?:?[A-Za-z])?)?\b)
-如果您想更好地理解它,请尝试使用在线正则表达式资源,如。是的,谢谢!我也会调查RegexStorm。
import string

names = [
    "Car Cycle 5 B Ap 1233",
    "Potato street 13 1 AB",
    "Chrome Safari 41 Ap 765",
    "Highstreet 53 Ap 2632/BH",
    "Something street 91/Daniel",
    ]

for name in names:
    result = []
    words = name.split()
    while any(words) and all(c in string.ascii_letters for c in words[0]):
        result += [words[0]]
        words = words[1:]
    if any(words) and all(c in string.digits for c in words[0]):
        result += [words[0]]
        words = words[1:]
    if any(words) and words[0] in string.ascii_uppercase:
        result += [words[0]]
        words = words[1:]
    print " ".join(result)
^([\p{L} ]+ \d{1,4}(?: ?[A-Za-z])?\b)