파이썬 정규표현식으로 문자열의 일부분만 배제하는 방법
조회수 1610회
주소중에서 최초 나오는 번지까지 살리고, 그 뒷부분은 삭제를 하려고 합니다. 그런데 파이썬 정규표현식을 이것 저것 해봐도 잘 안되네요. ㅠ
제3층, 제3070호, 제105동, 중화산동2가.. 이런걸 정규표현식에서 제외하고 싶습니다. 방법을 부탁합니다.
사용한 정규표현식 : (\d{1,4}\-\d{1,4})|(\d{1,4})|(산\d{1,4}\-\d{1,4})|(산\d{1,4})
대상 데이터:
강원도 강릉시 옥계면 남양리 1470-1, 1497
부산광역시 사상구 괘법동 529-1 르네시떼 제3층 제3070호
경상남도 통영시 광도면 죽림리 1405
전라남도 광양시 태인동 1320-41 동광아파트 제105동 제3층 제307호
전라북도 전주시 완산구 중화산동2가 549-14 제지하층 제101호
충청남도 천안시동남구 목천읍 신계리 422 천안목천동우1차아파트 제상가동 제2층 제203호
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
2 답변
-
아래와 같이 처리하는 것이 더 빠르고 수정하기도 용이합니다.
addr = '강원도 강릉시 옥계면 남양리 1470-1, 1497' addr1 = '부산광역시 사상구 괘법동 529-1 르네시떼 제3층 제3070호' addr2 = '경상남도 통영시 광도면 죽림리 1405' addr3 = '전라남도 광양시 태인동 1320-41 동광아파트 제105동 제3층 제307호' addr4 = '전라북도 전주시 완산구 중화산동2가 549-14 제지하층 제101호' addr5 = '충청남도 천안시 동남구 목천읍 신계리 산422 천안목천동우1차아파트 제상가동 제2층 제203호' addr6 = '사천시 사천읍 구암리 산48-1 일원' addr7 = '전라남도 영광군 홍농읍 진덕리 35 제1층 27' def extract_addr(addr): tokens = addr.translate({ord(','):None}).split() # , 제거후 토큰 분리 for i, token in enumerate(tokens): if token[-1] in ['동', '리', '가']: # 토큰의 끝글자가 동, 리, 가 라면 다음 토큰은 번지수다. return ' '.join(tokens[0:i+2]) list(map(extract_addr, (addr, addr1, addr2, addr3, addr4, addr5, addr6, addr7))) ['강원도 강릉시 옥계면 남양리 1470-1', '부산광역시 사상구 괘법동 529-1', '경상남도 통영시 광도면 죽림리 1405', '전라남도 광양시 태인동 1320-41', '전라북도 전주시 완산구 중화산동2가 549-14', '충청남도 천안시 동남구 목천읍 신계리 산422', '사천시 사천읍 구암리 산48-1', '전라남도 영광군 홍농읍 진덕리 35']
- 해결하려고 며칠 고민했었는데 역시 질문하길 잘했네요. 정영훈님 매번 자세한 설명과 해결방안 제시 감사합니다. 퇴근후 자세히 들여다 보겠습니다. ^^ 알 수 없는 사용자 2020.2.12 11:33
-
정규식만으로 모든 주소를 처리하기 어려워 보입니다.
간단하게 전용 파서를 만들어 사용하는 것이 나아 보입니다.
도 시 군 구 등등 행정구분 형태가 다르기 때문에 토큰 갯수로 추출하는 것도 안되고 '중화산동2가' 이런 경우 때문에 숫자 유무로 판단하는 것도 안됩니다.
즉 '경상남도 통영시 광도면 죽림리' 토큰이 4개지만 '전라남도 광양시 태인동' 는 3개입니다. '충청남도 천안시 동남구 목천읍 신계리' 는 5개구요
그러면 쉽게 생각해서 번지수 나오기 전까진 숫자는 없다는 규칙은 어떨지 보면....'중화산동2가' 경우가 나온다는 거지요.
거기에 번지수는 '-' 이 존재할 수도 없을 수도 있습니다.
애매모호한 상황이 될 수 있는 것이
경상남도 통영시 광도면 죽림1리 105 무슨아파트 101 호
는 정규식으로 처리하기 애매모호 합니다.정규식 고민할 시간에 동, 리 다음이 번지수이니 토큰으로 분리후 제일 끝자가 동 혹은 리면 다음 토큰이 번지수이니 간단하게 프로그래밍하는 것이 더 효율적으로 보입니다.
코드는 정규식을 작성해봤는데...아마도 여러 형태의 주소가 들어오면 매칭 안되는 경우가 있을 겁니다.
import re addr = '강원도 강릉시 옥계면 남양리 1470-1, 1497' addr1 = '부산광역시 사상구 괘법동 529-1 르네시떼 제3층 제3070호' addr2 = '경상남도 통영시 광도면 죽림리 1405' addr3 = '전라남도 광양시 태인동 1320-41 동광아파트 제105동 제3층 제307호' addr4 = '전라북도 전주시 완산구 중화산동2가 549-14 제지하층 제101호' addr5 = '충청남도 천안시 동남구 목천읍 신계리 산422 천안목천동우1차아파트 제상가동 제2층 제203호' addr6 = '사천시 사천읍 구암리 산48-1 일원' m = re.compile(r'^([\w|\s]+[\s|산]\d{1,4}[-]?\d{1,4}?)[,]?') list(map(m.findall, (addr, addr1, addr2, addr3, addr4, addr5, addr6))) [['강원도 강릉시 옥계면 남양리 1470-1'], ['부산광역시 사상구 괘법동 529-1'], ['경상남도 통영시 광도면 죽림리 1405'], ['전라남도 광양시 태인동 1320-4'], ['전라북도 전주시 완산구 중화산동2가 549-1'], ['충청남도 천안시 동남구 목천읍 신계리 산422'], ['사천시 사천읍 구암리 산48-1']]
댓글 입력