본문 바로가기
코딩 연습/파이썬 크롤링

구분자로 연결된 문자열의 일부분을 추출하는 방법

by good4me 2023. 3. 25.

goodthings4me.tistory.com

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

 

파이썬으로 주소 분리 작업을 많이 하다 보면 구분자로 연결한 수십 수백 만 건의 텍스트 결과물에서 특정 부분을 추출하는 경우가 가끔 있다. 이때 엑셀로 변환 후에 추출할 수도 있지만, 엑셀의 행의 한계(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
광장동
------------------------------

댓글