2016-11-16 178 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)