正则表达式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个示例):
在字符串开头开始匹配^
属于“字母”类别的空格或unicode字符的字符类,1-无限次[\p{L}]+
数字,1-4次\d{1,4}
可选空格和单个字母的非捕获组,0-1次(?:?[A-Za-z])?
只需使用像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)