2016-11-16 48 views
3

我在他们不善形成的地址表格,我需要他们相当不错的使用进行地理编码。我已经尝试了一些Python库来解析地址,但他们无法弄清楚其中的一些。作为一个例子,使用正则表达式和python移动城市地址块,加符号

“N MONON AVE FRANCESVILLEW¯¯YELLOW ST”

的状态为所有这些是印第安纳州,我没有问题串联成提交的字符串。在上面的例子中,它是一个交叉点,其地理编码器不接受为:

“N MONON AVE &W¯¯YELLOW ST FRANCESVILLE”

我的想法是最简单的方法是找到之后的第一字街道类型(Ave,Dr,Ct等),将其移动到最后,并在其位置添加一个&符号。

我有这样的代码,这可能是效率极其低下,但它仅捕获的第一条街道类型;在上面的例子中,它会输出AVE。

/(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)[^(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)]/i 

我不知道该怎么做,就是告诉它在街道类型的第一个实例后立即抓取任何单词。从那里,我应该可以使用re.search和.group [n]来提取城市,并将其放入解析的字符串中。

+0

见https://regex101.com/r/Am033H/1和http://ideone.com/UNgnAy。 –

回答

1

您可以使用

rx = re.compile(r"(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)\s+(\S+)\s*(.*)", re.I) 

regex demo

加料\s+(\S+)\s*(.*):1+空格,1+非空格((\S+),第2组),0 +空格(\s*)和任何0+字符以外的换行符(.*,组3)。

Python demo

import re 
rx = re.compile(r"(Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St)\s+(\S+)\s*(.*)", re.I) 
s = "N MONON AVE FRANCESVILLE W YELLOW ST" 
result = re.sub(rx, r'\1 & \3 \2', s) 
print(result) 
+0

太棒了!我仍然试图让团体失望; re.sub非常强大。 我也试过这一点上不符合规定的地址,以确保它没惹他们,它工作得很好。 –

+0

很高兴为你效劳。如果我的回答对你有帮助,请考虑upvoting(参见[如何在堆栈溢出?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)) 。 –

+0

让我知道什么是“获得团体下来”的意思是,你的意思是,你还需要退回组的列表?它可以很容易地在're.sub'中使用回调来完成。 –

1
import re 
s = "N MONON AVE FRANCESVILLE W YELLOW ST" 
regex = r"(.*) (Avenue|Lane|Road|Boulevard|Drive|Street|Ave|Dr|Rd|Blvd|Ln|St) ([A-Za-z]*) (.*)" 
result = re.sub(regex, r"\1 \2 & \4 \3", s, flags=re.I) 
print(result)