[python library] re 라이브러리와 정규 표현식

·2024년 8월 14일
0

python library

목록 보기
3/3
post-thumbnail

1. Python의 re 라이브러리

Python의 re 라이브러리는 정규 표현식을 사용하여 문자열을 검색하고 조작하는 강력한 도구입니다. 정규 표현식(정규식)은 특정한 규칙을 가진 문자열의 집합을 표현하는 형식 언어로, 복잡한 문자열 패턴을 간단하게 처리할 수 있습니다.


2. 정규 표현식(regular expression) 패턴 구성 요소

  • 메타문자
메타문자설명예시
.임의의 한 문자a.b → acb , a1b , ...
^문자열의 시작^ab → abc , abd , ...
$문자열의 끝ab$ → 1ab , 2ab , 3ab , ...
*바로 앞 문자열 0회 이상 반복ab*c → ac , abc , abbc , abbbc , ...
+바로 앞 문자열 1회 이상 반복ab+c → abc , abbc , abbbc , ...
?바로 앞 문자열 0회 또는 1회ab?c → ac , abc
{n, m}바로 앞 문자열 n회부터 m회까지 반복a{1,3} → a , aa , aaa
[ ]문자의 집합 또는 범위[a-z] → a , b , c , ... , x , y , z
[^ ](부정) 괄호 안에 있는 것 제외[^a-z] → 소문자 a부터 z를 제외한 문자열
  • 특수 시퀀스
특수 시퀀스설명예시
\d숫자(= [0-9]) \d{3} → 123 , 456
\D숫자가 아닌 문자(= [^0-9]) \D+ → abc, @#$
\w단어 문자 (알파벳, 숫자, 밑줄)(= [a-zA-Z0-9_]) \w+ → abc , 123 , a_1
\W단어 문자가 아닌 문자(= [^a-zA-Z0-9_]) \W+ → @#! , " "
\s공백 문자(공백, \t, \n) \s+ → " " , \t , \n
\S공백 문자가 아닌 문자(= [^ \t\n\r\f\v]) \S+ →abc , 123 , a_1

3. re 라이브러리 기본 사용법

re. search( <sub string> , <main string> )

import re

# <sub string>이 <main string>에 있을 경우
A = re.search(r'abc', 'abcdef')
print(A.start())	# 0
print(A.end())		# 3
print(A.group())	# 'abc'

# <sub string>이 <main string>에 없을 경우
B = re.search(r'abc', 'ab')
print(B)			# None

# <sub string>이 <main string>에 두 번 이상 있을 경우 ▶ 제일 첫 <sub string> 반환
C = re.search(r'abc', 'abcabc')
print(C)			# <re.Match object; span=(0, 3), match='abc'>

# 두 자리 숫자 찾기
D = re.search(r'\d\d', 'a1ab12abc123')
print(D)			# <re.Match object; span=(4, 6), match='12'>

re.match( <sub string> , <main string> )

import re

# <sub string>이 <main string>의 시작에 있을 경우
A = re.match(r'abc', 'abcdef')
print(A.start())  # 0
print(A.end())    # 3
print(A.group())  # 'abc'

# <sub string>이 <main string>의 시작에 없을 경우
B = re.match(r'abc', 'ab')
print(B)  # None

# <sub string>이 <main string>의 시작에 두 번 이상 있을 경우 ▶ 제일 첫 <sub string> 반환
C = re.match(r'abc', 'abcabc')
print(C)  # <re.Match object; span=(0, 3), match='abc'>

# 두 자리 숫자가 문자열의 시작에 있을 경우
D = re.match(r'\d\d', '12abc123')
print(D)  # <re.Match object; span=(0, 2), match='12'>

# 두 자리 숫자가 문자열의 시작에 없을 경우
E = re.match(r'\d\d', 'a1ab12abc123')
print(E)  # None

re.compile( <pattern> , <flags=0> )

import re

# 정규 표현식을 컴파일하여 패턴 객체 생성
pattern = re.compile(r'\d+')

# 패턴 객체를 사용하여 매칭 작업 수행
result = pattern.search('The year is 2024')
print(result.group())  # '2024'

re.fullmatch( <pattern> , <string> , <flags=0> )

import re

# 문자열 전체가 패턴과 일치하는지 확인
result = re.fullmatch(r'\d+', '123456')
print(result.group())  # '123456'

# 문자열 전체가 패턴과 일치하지 않는 경우
result = re.fullmatch(r'\d+', '123abc')
print(result)  # None

re.split( <pattern> , <string> , <maxsplit=0> , <flags=0> )

import re

# 패턴을 기준으로 문자열을 분할하여 리스트로 반환
result = re.split(r'\s+', 'This is a test string')
print(result)  # ['This', 'is', 'a', 'test', 'string']

# 최대 분할 횟수를 지정
result = re.split(r'\s+', 'This is a test string', maxsplit=2)
print(result)  # ['This', 'is', 'a test string']

re.findall( <pattern> , <string> , <flags=0> )

import re

# 문자열에서 패턴과 일치하는 모든 부분을 찾아 리스트로 반환
result = re.findall(r'\d+', 'There are 123 apples and 456 oranges')
print(result)  # ['123', '456']

re.finditer( <pattern> , <string> , <flags=0> )

import re

# 문자열에서 패턴과 일치하는 모든 부분을 찾아 반복 가능한 객체로 반환
matches = re.finditer(r'\d+', 'There are 123 apples and 456 oranges')
for match in matches:
    print(match.group())  # '123', '456'

re.sub( <pattern> , <repl> , <string> , <count=0> , <flags=0> )

import re

# 패턴과 일치하는 부분을 다른 문자열로 대체
result = re.sub(r'\d+', 'number', 'There are 123 apples and 456 oranges')
print(result)  # 'There are number apples and number oranges'

re.subn( <pattern> , <repl> , <string> , <count=0> , <flags=0> )

import re

# 패턴과 일치하는 부분을 다른 문자열로 대체하며, 대체된 횟수도 함께 반환
result = re.subn(r'\d+', 'number', 'There are 123 apples and 456 oranges')
print(result)  # ('There are number apples and number oranges', 2)

re.escape( <string> )

import re

# 문자열에서 특수 문자를 이스케이프 처리
escaped_string = re.escape('This is a test. [Special characters: *?+|]')
print(escaped_string)  # 'This\\ is\\ a\\ test\\.\\ \\[Special\\ characters\\:\\ \\*\\?\\+\\|\\]'
profile
납작복숭아 먹고 싶어요

0개의 댓글