본문 바로가기
카테고리 없음

파일 입출력과 정규표현식

by BOOST YOUR INFORMATION 2026. 7. 18.

파일 입출력과 정규표현식

1. 기본 개요

파이썬 공식 문서(Python 3 Tutorial, "7.2. Reading and Writing Files")에 따르면, 파일을 다루는 가장 기본적인 함수는 open()이며, 이는 파일 객체(file object)를 반환합니다. open()은 파일 경로와 모드(mode)를 인자로 받는데, 대표적인 모드로는 읽기('r'), 쓰기('w'), 추가('a'), 바이너리('b') 등이 있습니다.

with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()

공식 문서는 with 문을 사용해 파일을 여는 것을 권장합니다. with 블록이 끝나면 예외 발생 여부와 관계없이 파일이 자동으로 닫히기 때문에, 파일을 열어둔 채로 방치해 자원이 누수되는 문제를 방지할 수 있습니다.

정규표현식(regular expression, regex)은 문자열에서 특정 패턴을 찾거나 치환하기 위한 표기법입니다. 파이썬은 표준 라이브러리의 re 모듈을 통해 정규표현식 기능을 제공합니다(Python 공식 문서, "re — Regular expression operations").

import re
match = re.search(r"\d+", "가격은 12000원입니다")
print(match.group())  # '12000'

2. 기능과 스펙

파일 입출력 주요 메서드

  • read(): 파일 전체(또는 지정한 바이트 수만큼)를 문자열로 읽기
  • readline(): 한 줄씩 읽기
  • readlines(): 모든 줄을 리스트로 읽기
  • write() / writelines(): 문자열(또는 문자열 리스트)을 파일에 쓰기
  • encoding 매개변수: 텍스트 파일을 열 때 문자 인코딩을 명시적으로 지정(미지정 시 플랫폼 기본 인코딩이 사용되므로 이식성 문제가 생길 수 있음)

re 모듈 주요 함수

  • re.search(): 문자열 전체에서 패턴과 처음 일치하는 부분을 찾음
  • re.match(): 문자열의 시작 부분이 패턴과 일치하는지 검사
  • re.findall(): 패턴과 일치하는 모든 부분을 리스트로 반환
  • re.sub(): 패턴과 일치하는 부분을 다른 문자열로 치환
  • re.compile(): 정규표현식 패턴을 미리 컴파일해 객체로 만들어 반복 사용 시 성능을 높임

정규표현식 문법에는 \d(숫자), \w(단어 문자), .(임의의 한 문자), *(0회 이상 반복), +(1회 이상 반복), ?(0회 또는 1회) 등의 메타문자가 포함되며, 파이썬 공식 문서는 정규표현식 패턴을 작성할 때 원시 문자열(raw string, r"...")을 사용할 것을 권장합니다. 이는 백슬래시(\)가 파이썬 문자열 이스케이프와 정규표현식 이스케이프 양쪽에서 다른 의미로 해석되어 혼란을 줄 수 있기 때문입니다.

3. 장단점

장점

  • with 문을 활용한 파일 입출력은 자원 관리를 자동화해 코드가 간결하고 안전해진다
  • 정규표현식은 단순 문자열 검색으로는 처리하기 힘든 복잡한 패턴(이메일 형식, 전화번호, 숫자 추출 등)을 짧은 코드로 처리할 수 있다
  • re.compile()로 패턴을 미리 컴파일해두면 같은 패턴을 반복 사용할 때 성능 이점이 있다

단점

  • 파일 인코딩을 명시하지 않으면 운영체제나 로케일 설정에 따라 다른 결과가 나올 수 있어 이식성 문제가 발생하기 쉽다
  • 정규표현식은 문법이 압축적이고 가독성이 낮아, 복잡한 패턴은 작성자 본인도 나중에 이해하기 어려운 경우가 많다
  • 정규표현식으로 HTML이나 JSON처럼 중첩 구조를 가진 데이터를 파싱하려고 하면 예상치 못한 오류가 발생하기 쉬우며, 이런 경우 전용 파서를 쓰는 것이 더 안전하다는 것이 널리 알려진 권고 사항이다

개인적 견해 및 비판: 정규표현식은 "만능 문자열 도구"처럼 여겨지는 경우가 많지만, 실제로는 정형화된 단순 패턴(전화번호, 우편번호, 간단한 토큰 추출) 이상으로 확장하면 유지보수가 급격히 어려워지는 도구라고 생각합니다. 특히 HTML이나 XML처럼 계층 구조가 있는 데이터를 정규표현식만으로 파싱하려는 시도는, 파이썬 커뮤니티에서도 오랫동안 반복적으로 지적되어 온 안티패턴입니다. 개인적으로는 정규표현식을 "짧고 명확한 패턴에 한해서" 사용하고, 구조화된 데이터는 BeautifulSoup이나 json 모듈처럼 목적에 맞는 전용 도구를 쓰는 것이 훨씬 안전하다고 봅니다. 파일 인코딩 문제 역시 초보자가 놓치기 쉬운 부분인데, encoding="utf-8"을 습관적으로 명시하는 것만으로도 실무에서 겪는 자잘한 오류의 상당수를 예방할 수 있다고 생각합니다.

4. 추천 대상

  • 로그 파일, CSV, 텍스트 데이터를 다루는 데이터 처리 실무자
  • 사용자 입력값 검증, 텍스트 전처리 작업이 필요한 백엔드/데이터 엔지니어
  • 정규표현식 기초 문법을 실전 예제와 함께 익히고 싶은 파이썬 학습자

5. FAQ

Q1. open() 대신 with open()을 써야 하는 이유는 무엇인가요?
with 문을 사용하면 블록을 벗어날 때 파일이 자동으로 닫히기 때문에, 예외가 발생해도 파일이 열린 채로 남는 상황을 방지할 수 있습니다. 파이썬 공식 문서도 이 방식을 권장 관행으로 소개하고 있습니다.

Q2. re.match()re.search()는 어떻게 다른가요?
re.match()는 문자열의 맨 앞부터 패턴이 일치하는지만 검사하고, re.search()는 문자열 전체를 훑어 패턴과 일치하는 첫 부분을 찾습니다.

Q3. 정규표현식 패턴 앞에 r을 붙이는 이유는 무엇인가요?
원시 문자열(raw string)로 만들어 백슬래시가 파이썬 자체의 이스케이프 문자로 해석되지 않고 정규표현식 엔진에 그대로 전달되도록 하기 위함입니다.

6. 출처


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 ⚡ 정보 부스터 🚀