Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 텍스트를 검색하고 바꾸는 방법 총정리

문제 상황

문자열 안에서 특정 텍스트 패턴을 검색하거나 다른 문자열로 교체해야 하는 경우가 자주 있습니다. 패턴이 단순한 리터럴(literal) 문자열이라면 파이썬 내장 메서드인 str.replace()만으로도 충분하지만, 패턴이 복잡해지면 정규 표현식(regular expression)과 re 모듈을 활용하는 것이 좋습니다.

예제 데이터 준비

먼저 실습에 사용할 문자열을 생성합니다. 제너레이터로 단어를 하나씩 만들고 공백으로 연결했습니다.

def sample():
    yield 'Is'
    yield 'USA'
    yield 'Colder'
    yield 'Than'
    yield 'Canada?'

text = ' '.join(sample())
print(f"Output \n {text}")

출력 결과

Is USA Colder Than Canada?

1. 텍스트 검색하기

가장 기본적인 방법은 동등 연산자(==)로 문자열 전체가 일치하는지 확인하는 것입니다.

# 정확히 일치하는 텍스트 검색
print(f"Output \n {text == 'USA'}")

출력 결과

False

문자열 전체가 아닌 부분 일치 여부를 확인할 때는 str.find(), str.startswith(), str.endswith() 같은 기본 문자열 메서드를 사용할 수 있습니다.

startswith() — 문자열이 특정 접두사로 시작하는지 확인합니다.

# 텍스트가 'Is'로 시작하는지 확인
print(f"Output \n {text.startswith('Is')}")

출력 결과

True

endswith() — 문자열이 특정 접미사로 끝나는지 확인합니다.

# 텍스트가 'Canada?'로 끝나는지 확인
print(f"Output \n {text.endswith('Canada?')}")

출력 결과

True

find() — 찾는 문자열이 시작되는 인덱스를 반환하며, 없으면 -1을 반환합니다.

# find()로 텍스트 위치 검색
print(f"Output \n {text.find('USA')}")

출력 결과

3

2. 정규 표현식으로 복잡한 패턴 검색하기

검색 대상이 단순한 문자열이 아니라 날짜처럼 형식이 정해진 복잡한 패턴이라면 re 모듈을 사용하는 것이 효율적입니다.

# 문자열 형식의 날짜 생성
date1 = '22/10/2020'

아래 예제는 텍스트가 "숫자/숫자/숫자" 형식인지 확인합니다. \d+는 하나 이상의 숫자와 일치하는 패턴입니다.

# \d+ : 하나 이상의 숫자와 매칭
import re
if re.match(r'\d+/\d+/\d+', date1):
    print('yes')
else:
    print('no')

출력 결과

yes

3. 간단한 텍스트 교체 — str.replace()

찾을 문자열과 교체할 문자열이 모두 단순하다면 str.replace()를 사용하는 것이 가장 간편합니다.

print(f"Output \n {text.replace('USA', 'Australia')}")

출력 결과

Is Australia Colder Than Canada?

4. 정규 표현식으로 패턴 교체 — re.sub()

복잡한 패턴을 검색·교체할 때는 re 모듈의 sub() 메서드를 활용합니다. 첫 번째 인수는 매칭할 패턴, 두 번째 인수는 교체할 패턴입니다.

아래 예제에서는 dd/mm/yyyy 형식의 날짜를 yyyy-dd-mm 형식으로 변환합니다. 역슬래시 숫자(예: \3)는 패턴 내 캡처 그룹(capture group) 번호를 참조합니다.

import re
sentence = 'Date is 22/11/2020. Tomorrow is 23/11/2020.'

# (\d+)/(\d+)/(\d+) 패턴을 \3-\1-\2 형식으로 교체
replaced_text = re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', sentence)
print(f"Output \n {replaced_text}")

출력 결과

Date is 2020-22-11. Tomorrow is 2020-23-11.

5. 성능 최적화 — re.compile()

동일한 패턴을 반복해서 사용한다면 re.compile()로 정규 표현식을 미리 컴파일해 두면 실행 성능을 높일 수 있습니다.

pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
replaced_pattern = pattern.sub(r'\3-\1-\2', sentence)
print(f"Output \n {replaced_pattern}")

출력 결과

Date is 2020-22-11. Tomorrow is 2020-23-11.

6. 교체 횟수 확인 — re.subn()

subn() 메서드는 텍스트를 교체하는 동시에 치환이 몇 번 이루어졌는지도 함께 반환합니다.

output, count = pattern.subn(r'\3-\1-\2', sentence)
print(f"Output \n {output}")

출력 결과

Date is 2020-22-11. Tomorrow is 2020-23-11.
print(f"Output \n {count}")

출력 결과

2

마무리 정리

  • 단순한 문자열 검색·교체 → find(), startswith(), endswith(), str.replace()
  • 복잡한 패턴 검색 → re.match() 등 정규 표현식
  • 복잡한 패턴 교체 → re.sub()와 캡처 그룹 활용
  • 패턴 반복 사용 시 → re.compile()로 사전 컴파일하여 성능 향상
  • 치환 횟수까지 확인 → re.subn()