2016-11-16 11 views
3

주소가 잘못 구성된 스프레드 시트가 있는데 지오 코딩에 사용할 수 있도록 합리적으로 필요합니다. 나는 주소를 파싱하기 위해 파이썬 라이브러리 중 일부를 시도했지만, 그 중 일부를 파악할 수는 없다. 예를 들어, 그들 모두에 대한regex 및 python을 사용하여 주소 블록에서 도시를 이동하고 앰퍼샌드를 추가하십시오.

"N MONON AVE FRANCESVILLE W 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

당신은 또한이 \s+(\S+)\s*(.*)regex demo

를 참조

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

사용할 수 있습니다 : 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을 고려해보십시오 (Stack Overflow에 대한 upvote 방법 (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)