re.match('패턴', '문자열')
>>> import re
>>> re.match('Hello', 'Hello, world!') # 문자열이 있으므로 정규표현식 매치 객체가 반환됨
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.match('Python', 'Hello, world!') # 문자열이 없으므로 아무것도 반환되지 않음
^문자열
: 문자열 앞에 ^를 붙이면 문자열이 맨 앞에 오는지 판단문자열$
: 문자열 뒤에 $를 붙이면 문자열이 맨 뒤에 오는지 판단re.search('패턴', '문자열')
>>> re.search('^Hello', 'Hello, world!') # Hello로 시작하므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.search('world!$', 'Hello, world!') # world!로 끝나므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(7, 13), match='world!'>
|
: 특정 문자열에서 지정된 문자열(문자)이 하나라도 포함되는지 판단
문자열|문자열
문자열|문자열|문자열|문자열
>>> re.match('hello|world', 'hello') # hello 또는 world가 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 5), match='hello'>
숫자 범위는 0-9처럼 표현
[0-9]*
: *는 문자(숫자)가 0개 이상 있는지 판단[0-9]+
: +는 1개 이상 있는지 판단>>> re.match('[0-9]*', '1234') # 1234는 0부터 9까지 숫자가 0개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='1234'>
>>> re.match('[0-9]+', '1234') # 1234는 0부터 9까지 숫자가 1개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='1234'>
>>> re.match('[0-9]+', 'abcd') # abcd는 0부터 9까지 숫자가 1개 이상 없으므로 패턴에 매칭되지 않음
a*b, a+b
>>> re.match('a*b', 'b') # b에는 a가 0개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 1), match='b'>
>>> re.match('a+b', 'b') # b에는 a가 1개 이상 없으므로 패턴에 매칭되지 않음
>>> re.match('a*b', 'aab') # aab에는 a가 0개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 3), match='aab'>
>>> re.match('a+b', 'aab') # aab에는 a가 1개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 3), match='aab'>
문자?
: ? 앞의 문자(범위)가 0개 또는 1개인지 판단[0-9]?
.
: .이 있는 위치에 아무 문자(숫자)가 1개 있는지 판단>>> re.match('abc?d', 'abd') # abd에서 c 위치에 c가 0개 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 3), match='abd'>
>>> re.match('ab[0-9]?c', 'ab3c') # [0-9] 위치에 숫자가 1개 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='ab3c'>
>>> re.match('ab.d', 'abxd') # .이 있는 위치에 문자가 1개 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='abxd'>
문자{개수}
: 문자(숫자)가 정확히 몇 개 있는지 판단한다h{3}
: h가 3개 있는지 판단(문자열){개수}
: 문자열의 경우에는 문자열을 괄호로 묶고 뒤에 {개수} 형식을 지정(hello){3}
: hello가 3개 있는지 판단>>> re.match('h{3}', 'hhhello')
<_sre.SRE_Match object; span=(0, 3), match='hhh'>
>>> re.match('(hello){3}', 'hellohellohelloworld')
<_sre.SRE_Match object; span=(0, 15), match='hellohellohello'>
[0-9]{개수}
: 특정 범위의 문자(숫자)가 몇 개 있는지 판단>>> re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', '010-1000-1000') # 숫자 3개-4개-4개 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 13), match='010-1000-1000'>
>>> re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', '010-1000-100') # 숫자 3개-4개-4개 패턴에 매칭되지 않음
(문자){시작개수,끝개수}
(문자열){시작개수,끝개수}
[0-9]{시작개수,끝개수}
{시작개수,끝개수} 형식으로 시작 개수와 끝 개수를 지정해주면 특정 개수 사이에 들어가는지 판단한다.
>>> re.match('[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}', '02-100-1000') # 2~3개-3~4개-4개 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 11), match='02-100-1000'>
>>> re.match('[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}', '02-10-1000') # 2~3개-3~4개-4개 패턴에 매칭되지 않음
(정규표현식) (정규표현식)
: 패턴 안에서 정규표현식을 ( )(괄호)로 묶으면 그룹이 된다.매치객체.group(그룹숫자)
매치객체.groups()
>>> m = re.match('([0-9]+) ([0-9]+)', '10 295')
>>> m.group(1) # 첫 번째 그룹(그룹 1)에 매칭된 문자열을 반환
'10'
>>> m.group(2) # 두 번째 그룹(그룹 2)에 매칭된 문자열을 반환
'295'
>>> m.group() # 매칭된 문자열을 한꺼번에 반환
'10 295'
>>> m.group(0) # 매칭된 문자열을 한꺼번에 반환
'10 295'
>>> m.groups() # 각 그룹에 해당하는 문자열을 튜플 형태로 반환
('10', '295')
그룹 지정 없이 패턴에 매칭되는 모든 문자열을 가져오려면
re.findall('패턴', '문자열')
을 사용한다.
>>> re.findall('[0-9]+', '1 2 Fizz 4 Buzz Fizz 7 8')
['1', '2', '4', '7', '8']
match
메소드는 문자열 처음부터 시작해서 패턴에 일치하는지 확인한다. (문자열 처음부터 Greedy
하게 확인한다)
fullmatch
는 일치 여부를 확인하는 패턴과 대상 패턴이 정확하게 처음과 끝이 전부 일치해야 한다. (처음부터 확인해 가는게 아니라, 끝까지 탐색한 뒤에 일치 여부를 판단한다)
print(re.match('aa', 'aabbbbbb')) # <re.Match object; span=(0, 2), match='aa'>
print(re.fullmatch('aa', 'aabbbbbb')) # None