Python 정규식의 표현 및 사용방법을 알아보자.
알아두면 매우 유용하게 사용할 수 있다.
■ 정규식 : [] 안에 . ^ $ * + ? { } [ ] \ | ( ) 을 사용하는 식
표현식 | 동일 표현식 | 설명 |
\d | [0-9] | 숫자와 매치 |
\D | [^0-9] | 숫자가 아닌 것과 매치 |
\s | [\t\n\r\f\v] | 공백 매치 |
\S | [^\t\n\r\f\v] | 공백 아닌 것과 매치 |
\w | [a-zA-z0-9_] | 문자, 숫자 매치 |
\W | [^a-zA-z0-9_] | 문자, 숫자 아닌 것과 매치 |
. | a.d 사이에 들어가는 모든 문자와 매치 (Yes : abcd, abd No : ade, a0e) | |
ab*c | * 바로 앞에 있는 문자 b가 0부터 매치 (ac, abc, abbc 모두 매치) | |
ab+c | * 과 동일, 다른점은 문자 b가 1부터 매치 (ac는 매치 안됨) | |
ab{2}c | b가 2번 반복 되어야 매치 (Yes : abbc No : abc) | |
ab{2,5}c | b가 2~5번 반복되면 매치 | |
ab?c | ab{0,1}c | b가 0~1번 반복되면 매치 |
^abc | 문자열의 처음은 항상 abc로 시작하면 매치 (re.MULTILINE 일 경우 라인별 첫 문자) | |
\Aabc | 문자열의 처음은 항상 abc로 시작하면 매치 (re.MULTILINE 과 상관없음) | |
abc$ | 문자열의 마지막은 항상 abc로 끝나면 매치 (re.MULTILINE 일 경우 라인별 첫 문자) | |
abc\Z | 문자열의 마지막은 항상 abc로 끝나면 매치 (re.MULTILINE 과 상관없음) | |
abc|def | abc 또는 def가 있으면 매치 | |
\babc\b | 앞뒤로 스페이스가 있을 경우에만 매치 | |
\Babc\B | 앞뒤로 스페이스가 없을 경우에만 매치 |
■ 정규식 응용
import re
p = re.compile('[a-z]+')
m = p.match("abc") # 문자열 처음부터 정규식과 매치되는지 확인
print(m) # 결과값 : <re.Match object span=(0, 3), match='abc'>
m = p.match("00abc")
print(m) # 결과값 : None
m = p.search("abc") # 문자열 전체를 검색하여 정규식과 매치되는지 확인
print(m) # 결과값 : <re.Match object; span=(0, 3), match='abc'>
m = p.search("00abc")
print(m) # 결과값 : <re.Match object; span=(2, 5), match='abc'>
m = p.findall("a b c") # 리스트로 반환
print(m) # 결과값 : ['a', 'b', 'c']
m = p.finditer("abc def ghi") # 반복 가능한 개체로 돌려줌
print(m) # 결과값 : <callable_iterator object at 0x000001886C72FFD0>
for i in m:
print(i)
# 결과값
# <re.Match object; span=(0, 3), match='abc'>
# <re.Match object; span=(4, 7), match='def'>
# <re.Match object; span=(8, 11), match='ghi'>
참고) 위 2줄은 아래 1줄로 사용할 수 있음.
p = re.compile('[a-z]+')
m = p.match("abc")
m = re.match('[a-z]+', "abc")
# #1, #2의 차이점
import re
p = re.compile("^abc\s\w+") #1
p = re.compile("^abc\s\w+", re.MULTILINE) #2
data = """abc one
abc two
abc three"""
print(p.findall(data)) # 결과값 : ['abc one'] - 첫 번째 줄만 매치 #1
print(p.findall(data)) # 결과값 : ['abc one', 'abc two', 'abc three'] - 라인별로 매치 #2
# '\abc'를 찾을 때는 \를 하나 더 쓴다. '\\abc'를 찾을 때는 '\\\\abc' 이렇게 사용한다.
p = re.compile("\\abc")
# 간단하게 사용하는 방법은 앞에 r을 붙이면 된다.
p = re.compile(r"\abc")
# 전화번호 형태의 정규식
p = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d+[-]\d+[-]\d+)")
m = p.search("mobile 010-1234-5678")
print(m.group(0)) # 결과값 : mobile 010-1234-5678 (전체 문자열 반환)
print(m.group(1)) # 결과값 : mobile (괄호로 묶인 1번째 문자열 반환)
print(m.group("name")) # 결과값 : mobile (괄호로 묶인 1번째 문자열을 name이라는 이름을 통하여 문자열 반환)
print(m.group(2)) # 결과값 : 010-1234-5678 (괄호로 묶인 2번째 문자열 반환)
# 문자열 바꾸기
p = re.compile("(park|kim|lee)")
m = p.sub("first", "park name and kim name")
print(m) # first name and first name
p = re.compile(r"(?P<name>\w+)\s+(?P<phone>\d+[-]\d+[-]\d+)")
m = p.sub("\g<phone> \g<name>", "mobile 010-1234-5678")
print(m) # 결과값 : 010-1234-5678 mobile
'Python' 카테고리의 다른 글
Python 예약어(Reserved word) 및 사용법 (0) | 2023.10.04 |
---|---|
Python이 인공지능(AI)에 가장 많이 사용되는 이유 (0) | 2023.10.03 |
Python 내장 함수 및 라이브러리 사용, 파일 다루기 (0) | 2023.05.22 |
Python 자료형 정리_2 (list, tuple, dictionary, bool, 집합) (0) | 2023.05.21 |
Python 자료형 정리_1 (숫자형, 문자형) (0) | 2023.05.20 |