[python] 텍스트 처리 - 정규식

Hello World·2024년 10월 3일

PythonNotebook

목록 보기
9/13
post-thumbnail

정규식(Regular Expression)

  • 문자열 패턴을 표현하는데 사용되는 특수한 문자열식이다.
  • 문자열을 처리하고 분석하는데 매우 유용하다.
  • 정규식을 사용하면 특정 패턴의 문자열을 검색하거나 추출하는 등 다양한 문자열 처리 작업을 쉽게 수행할 수 있다.
  • 파이썬에서는 re 모듈을 통해 사용할 수 있다.
  • 정규식은 일반적으로 패턴을 나타내는 특수한 의미를 가지는 문자인 메타 문자(meta character)로 이루어져 있다.

메타 문자(meta character)

  • 점(.): 어떤 문자가 와도 상관없다는 의미
  • 별(*): 몇 번 반복되어도 상관없다는 의미

search()

  • 주어진 패턴에 일치하는 첫번째 문자열만 반환 (결과값은 1개)
  • 조건이 안맞으면 None 반홤
pattern = 'abc'  # 정규식 패턴
text = 'defabc'  # 주어진 문자열
new_search = re.search(pattern, text)

print(new_search)
print(new_search.start())  # 일치하는 문자의 시작 인덱스
print(new_search.end())    # 일치하는 문자의 끝 인덱스
print(new_search.span())   # 일치하는 구간을 슬라이싱하기 위한 인덱스
print(new_search.group())  # 정규표현식의 검색 결과를 묶어서 최종 결과 

# 결과
# <re.Match object; span=(3, 6), match='abc'>
# 3
# 6
# (3, 6)
# abc
  • span=(3, 6): 일치하는 문자열의 인덱스
  • match='abc': 검색 결과
text = '이번 학기 개설 과목은 CS101입니다.'
pattern = r'[A-Za-z]{2}\d{3}'
match = re.search(pattern, text)
if match:
    print(f"과목 코드가 발견됨: {match.group()}")
else:
    print(f"과목 코드가 발견되지 않음: {match}")
    
# 결과
# 과목 코드가 발견됨: CS101

match()

  • 주어진 문자열의 첫글자부터 일치하는 패턴 문자열을 반환 (결과값은 1개)
  • 조건이 안맞으면 None 반홤
pattern = 'abc'  # 정규식 패턴
text = 'defabc'  # 주어진 문자열
new_search = re.match(pattern, text)

print(new_search)
# 결과
# None

findall()

  • 일치하는 문자열을 모두 찾아서 리스트로 반환한다.
# findall() 메서드 - 패턴이 일치하는 문자열을 모두 찾아서 리스트로 반환
pattern = 'abc'  # 정규식 패턴
text = 'defabc dddabc ccccabc'  # 주어진 문자열
new_search = re.findall(pattern, text)

print(new_search)

# 결과
# ['abc', 'abc', 'abc']

메타문자 : .

  • 임의의 문자 한 개를 의미하는 메타 문자이다.
pattern = 'A..A'  # A에서 시작해서 A로 끝나는 4글자 단어
text = 'ABBACCACBA'

match = re.search(pattern, text)

print(match)

# 결과
# <re.Match object; span=(0, 4), match='ABBA'>

메타 문자 : *

  • 직전에 있는 문자를 0회 이상 반복하는 패턴과 매치된다.
  • 예를 들어 AB*는 A, AA, AB, ABB 등의 어떤 문자열과도 일치된다.
  • 모두 A로 시작하고 B가 0회 이상 반복되기 때문이다.
print(re.search('AB*', 'A'))     # 'A'라는 문자열이 조건에 맞음
print(re.search('AB*', 'ABB'))   # 'ABB'라는 문자열이 조건에 맞음

# 결과
# <re.Match object; span=(0, 1), match='A'>
# <re.Match object; span=(0, 3), match='ABB'>

메타 문자 : +

  • 직전에 있는 임의의 패턴을 1회 이상 반복하는 패턴과 매치된다.
  • 따라서 AB+는 A와는 매치되지 않으며 AB, ABB와 같은 패턴의 문자열과 일치한다.
print(re.search('AB+', 'A'))  # 조건에 맞지 않음
print(re.search('AB+', 'AB'))

# 결과
# None
# <re.Match object; span=(0, 2), match='AB'>

자주 사용하는 문자 클래스

\d 숫자와 매치된다. [0-9]와 동일한 표현식이다.
\D 숫자가 아닌 것과 매치된다. [^0-9]와 동일한 표현식이다.
\s 화이트스페이스(whitespace) 문자와 매치된다. [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈칸은 공백 문 자(space)를 의미한다.
\S 화이트스페이스 문자가 아닌 것과 매치된다. [^ \t\n\r\f\v]와 동일한 표현식이다.
\w 문자+숫자(alphanumeric)와 매치된다. [a-zA-Z0-9_]와 동일한 표현식이다.
\W 문자+숫자(alphanumeric)가 아닌 문자와 매치된다. [^a-zA-Z0-9_]와 동일한 표현식이다

정규표현식 참고

0개의 댓글