파이썬(Python)/문법

[Python] 정규표현식으로 파일(XML, txt, html) 내용 검색(필터)하기 (re, match, compile, finditer)

끄적끄적아무거나 2022. 6. 2. 08:58
반응형

 

목차

     

    이번 포스트에서는 정규표현식(Regex)을 사용해서 텍스트 파일이나 웹문서(html, xml) 파일을 검색(search)해서 필터링(filtering) 하는 방법에 대해 알아보겠습니다. 

     

     

     

    파일 검색에 필요한 정규표현식 함수

     

    파일 검색에 사용할 정규표현식 함수는 아래와 같습니다.

     

    • re.compile(정규표현식)
    • re.finditer(compile 출력값, 문장)

     

    compile은 정규표현식을 입력으로 받습니다. 그리고 출력된 값을 변수에 저장하고 finditer 함수의 입력값으로 넣어주면 두번째 인자값인 문장에서 해당 정규표현식에 맞는 조건을 찾고 있으면 검색 결과를 출력 해줍니다.

     

    실제 사용 방법은 아래 예제를 통해 쉽게 이해하실 수 있습니다.

     

     

     

     

     

    미세먼지 데이터파일(XML) 검색하기 예제

     

    예제를 실행하기에 앞서 미세먼지 데이터 파일은 웹 스크롤링(web scrawling)을 통해 html 파일로 저장한 값입니다. 해당 내용은 아래 링크를 참조하시면 쉽게 이해하실 수 있습니다.

     

     

    [Python] 공공데이터포털에서 미세먼지 데이터 가져오기(크롤링, fine dust, API, 파이썬)

    목차 이번 시간에는 파이썬을 사용해서 공공데이터 포탈의 API에 접속해서 미세먼지 정보를 가져오는 방법에 대해 알아보겠습니다. API(Application Programming Interface) 란? API란 데이터회사나 웹서버(W

    scribblinganything.tistory.com

     

     

    [Python] RE 모듈로 미세먼지 데이터 필터링하기(정규표현, 특수문자)

    목차 미세먼지(PM10, PM25) 정보 가져오기 앞서 포스트에서 미세먼지 정보를 공공 데이터 포털에서 API를 사용해서 가져오는 방법에 대해 알아보았습니다. (https://scribblinganything.tistory.com/530) 상세 내

    scribblinganything.tistory.com

     

     

    파일을 읽어서 정규 표현식(Regex)로 검색할 때 한번에 파일을 다 읽어서 처리하면 검색이 잘되지 않습니다. 그러므로 파일 내용을 검색할 경우 한 줄 한줄 라인으로 가져와서 처리해줘야 합니다.

     

     

    예제 코드>>

    import re
    
    filter_condition = re.compile(r"<stationName>중구</stationName>")
    
    for lines in open("dust_info.html", encoding="utf-8"):
        for match in re.finditer(filter_condition, lines):
            print("match: ", match)
            print("match.group: ", match.group())
            print("match.string: ", match.string)
            print("match.end: ", match.end())
            print("match.start: ", match.start())
            print("match.span: ", match.span())

    3번 라인: compile을 사용해서 입력 문구의 내용만을 검색 합니다.

    5번 라인: html 파일에서 한줄 한줄 내용을 가져 옵니다. encoding을 utf-8을 사용하지 않으면 아래와 같은 cp949 에러 메세지가 발생합니다.

    에러메세지>>

    Traceback (most recent call last):
      File "d:\Python\test03\test06.py", line 5, in <module>
        for lines in open("dust_info.html"):
    UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 536: illegal multibyte sequence

    6번 라인: 가져온 라인 값을 finditer의 입력으로 넣고 match 되는 값을 찾습니다.

    7~12번 라인: finditer에서 제공하는 기능으로 group, string, end, start, span 내장 함수가 있습니다. 해당 값은 검색 값을 찾거나 인덱스(index) 번호를 알려 줍니다. 아래 결과 값을 확인하시면 쉽게 이해하실 수 있습니다.

     

     

     

    결과>>

    match:  <re.Match object; span=(8, 37), match='<stationName>중구</stationName>'>
    match.group:  <stationName>중구</stationName>
    match.string:          <stationName>중구</stationName>
    
    match.end:  37
    match.start:  8
    match.span:  (8, 37)

     

     

    반응형