ABOUT ME

-

  • 구분자로 연결된 문자열의 일부분을 추출하는 방법
    코딩 연습/파이썬 크롤링 2023. 3. 25. 13:15

    파이썬으로 구분자를 주어 추출한 네이버 부동산 주소 텍스트 데이터에서 동명칭을 분리하여 추출하는 방법

     

    파이썬으로 주소 분리 작업을 많이 하다 보면 구분자로 연결한 수십 수백 만 건의 텍스트 결과물에서 특정 부분을 추출하는 경우가 가끔 있다. 이때 엑셀로 변환 후에 추출할 수도 있지만, 엑셀의 행의 한계(row의 수가 104만개 정도)와 로딩 시간이나 함수 처리 시간이 너무 많이 걸리는 문제가 있다.

     

    아래처럼 된 텍스트 결과물에서 그 중간에 있는 도로명주소와 괄호 안의 동 명칭을 추출해야 일이 있었는데, 그 아래처럼 코드를 짜서 실행해보니 잘 나왔다.

    juso = [
    '1977.11.$서울특별시 구로구 고척동 97-3$서울특별시 구로구 경서로1길 14(고척동, 삼명아파트)$서울특별시 구로구 고척동 97-3 삼명아파트',
    '1977.12.$서울특별시 영등포구 여의도동 40-4$서울특별시 영등포구 국제금융로7가길 21(여의도동, 화랑아파트)$서울특별시 영등포구 여의도동 40-4 화랑아파트',
    '1978.04.$서울특별시 서초구 방배동 776-3$서울특별시 서초구 방배로37길 26-9(방배동, 쌍용예가클래식)$서울특별시 서초구 방배동 776-3 쌍용예가클래식',
    '1978.11.$서울특별시 광진구 광장동 145-8$서울특별시 광진구 아차산로 637(광장동)$서울특별시 광진구 광장동 145-8 워커힐아파트',
    ]
    
    for line in juso:
        idx = -1
        p = []  # 위치값 저장
        for i in range(1, line.count('$') + 1):
            idx = line.find('$', idx + 1)  # 데이터에서 '$' 위치값
            print(f'idx: {idx}')
    
            if i in (2, 3):  # 추출할 도로명 앞뒤에 있는 '$' 순번 숫자 지정
                p.append(idx)  # 위치값을 리스트에 저장
    
        print(p)
        road = line[p[0]+1:p[1]]  # 추출할 도로명주소
        print(road)
    
        # 도로명주소와 괄호 안의 동명칭 추출
        road2 = ''
        if road.find('(') == -1:  # find()에서 '(' 없으면 -1 반환
            road2 = road
        else:
            road2 = road[:road.find('(')]  # '(' 위치 찾고 거기까지 문자열 추출
        print(f'road2: {road2}')
    
        dong = road[road.find('(')+1:].split(',')
        if len(dong) > 1:
            print(dong[0])
        else:
            print(dong[0][:-1])
        print('-' * 30)

     

    good4me.co.kr

     

    위 코드를 실행하면 다음과 같은 결과가 나온다.

    idx: 8
    idx: 27
    idx: 58
    [27, 58]
    서울특별시 구로구 경서로1길 14(고척동, 삼명아파트)
    road2: 서울특별시 구로구 경서로1길 14
    고척동
    ------------------------------
    idx: 8
    idx: 29
    idx: 65
    [29, 65]
    서울특별시 영등포구 국제금융로7가길 21(여의도동, 화랑아파트)
    road2: 서울특별시 영등포구 국제금융로7가길 21
    여의도동
    ------------------------------
    idx: 8
    idx: 28
    idx: 64
    [28, 64]
    서울특별시 서초구 방배로37길 26-9(방배동, 쌍용예가클래식)
    road2: 서울특별시 서초구 방배로37길 26-9
    방배동
    ------------------------------
    idx: 8
    idx: 28
    idx: 52
    [28, 52]
    서울특별시 광진구 아차산로 637(광장동)
    road2: 서울특별시 광진구 아차산로 637
    광장동
    ------------------------------

Designed by goodthings4me.