파이썬 정규표현식으로 문자열의 일부분만 배제하는 방법

조회수 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']]
    
    • 자세히 들여다 보겠습니다. 많은 공부가 될 것 같습니다~~^^ 알 수 없는 사용자 2020.2.12 11:34

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)