re - python regex
정규표현식 사용
- 메타문자:
$()*+.?[]\^{}|
- 정규표현식에선 a는 문자 a와 매칭되지만 (는 (와 매칭되지 않는다. (가 메타 문자이기 때문이다.
- 이 때
\
백 슬래쉬를 쓰면 문자로 인식된다. \(
- 정규표현식: https://velog.io/@markyang92/regex-expregex
- 정말 메타문자를 쓰지 않았는지 주의하자
match
re.match(패턴, 문자열, 플래그)
는 문자열의 맨 앞 부터 시작해서 작성한 패턴이 일치하는지 확인한다.
a
로 시작하는 매칭되는 문자에 대한 정보를 출력한다.
'b'로 시작하므로, 매칭이 안된다.
search
re.search(패턴, 문자열, 플래그)
: match
와 유사하지만, 처음부터 일치하지 않아도 괜찮다.
findall
re.findall(패턴, 문자열, 플래그)
: 문자열 내 패턴
에 맞는 케이스를 전부 v찾아서 리스트로 변환한다.정규식에 매칭되는 문자열을 return
finditer
re.findall
과 유사하지만, 패턴에 맞는 문자열의 iterator를 반환한다.
fullmatch
fullmatch(패턴, 문자열, 플래그)
는 문자열에 시작과 끝이 정확하게 패턴과 일치할 때 반환한다.
match()
는 처음부터 패턴에 맞으면 반환하지만, 해당 함수는 시작과 끝이 정확하게 일치해야한다.
import re
print(re.fullmatch('a', 'a'))
print(re.fullmatch('a', 'aaa'))
print(re.fullmatch('a', 'ab'))
print(re.fullmatch('a', 'ba'))
print(re.fullmatch('a', 'baa'))
# <re.Match object; span=(0, 1), match='a'>
# None
# None
# None
# Noneimport re
split
- 문자열에서 패턴이 맞으면 이를 기점으로 리스트로 쪼갠다.
- 3번째 인자 (최대 split 수)를 지정 시, 문자열을 지정한 수 만큼 쪼개고 그 수가 도달하면 쪼개지 않는다.
import re
print(re.split('a', 'abaabca'))
print(re.split('a', 'abaabca', 2))
# ['', 'b', '', 'bc', '']
# ['', 'b', 'abca']
sub
sub(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)
: sub
는 문자열에 맞는 패턴을 2번째 인자(교체할 문자열)로 교체한다.
split의 최대 split 수와 동일하게 최대 교체 수를 지정하면, 문자열에 맞는 패턴을 교체할 문자열로 교체하고 그 수가 도달하면 더 이상 교체하지 않는다.
import re
print(re.sub('a', 'z', 'ab'))
print(re.sub('a', 'zxc', 'ab'))
print(re.sub('a', 'z', 'aaaab'))
print(re.sub('a', 'z', 'aaaab', 1))
# zb
# zxcb
# zzzzb
# zaaab
subn
subn(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)
: 는 sub()
와 동작은 동일하나, 반환 결과가 (문자열, 매칭횟수)형태로 반환된다.
import re
print(re.subn('a', 'z', 'ab'))
print(re.subn('a', 'zxc', 'ab'))
print(re.subn('a', 'z', 'aaaab'))
print(re.subn('a', 'z', 'aaaab', 1))
# ('zb', 1)
# ('zxcb', 1)
# ('zzzzb', 4)
# ('zaaab', 1)
compile
compile(패턴, 플래그)
는 패턴과 플래그가 동일한 정규식을 여러번 사용하려면 compile()을 지정하여, 위의 함수들을 사용할 수 있다.
import re
c = re.compile('a')
print(c.sub('zxc', 'abcdefg'))
print(c.search('vcxdfsa'))
# zxcbcdefg
# <re.Match object; span=(6, 7), match='a'>
purge
- 위 compile()로 만들어 놓은 객체는 캐시에 보통 100여 개 까지 저장된다고 알려져있다.
- 그 수를 넘으면, 초기화된다.
purge()
를 호출하면 100개가 넘어가지 않아도 캐시를 초기화하는 함수이다.
import re
re.purge()
escape (패턴)
escape()
는 패턴을 입력 받으면 특수문자들이 이스케이브(\
) 처리한 다음, 반환한다.
import re
print(re.escape('(\d)'))
# \(\\d\)
match object method()
findall()
을 제외하고 모든 한수들의 반환은 match object
로 반환된다.
match object
에서는 group(), start(), end()
등과 같이 찾은 패턴이 문자열의 위치나 매칭 문자열을 반환하는 함수
group()
, start()
, end()
, span()
- 예를 들어
search()
로 패턴에 맞는 문자열을 찾았다하면, group()
메서드를 통해 패턴에 맞는 문자열을 추출 할 수 있다.
start()
를 사용해 문자열에서 어디서 부터, 패턴에 맞는 문자가 시작했는지
end()
를 통해 어디까지 인지
span()
으로 어디부터 어디까지 인지 확인 할 수 있다.
import re
result = re.search('aa', 'baab')
print(result.group())
print(result.start())
print(result.end())
print(result.span())
# aa
# 1
# 3
# (1, 3)
groups()
,group(int)
: 만약 위와 같이 단순한 형태가 아닌, 소괄호 ()를 사용해 패턴을 묶는다면, 아래와 같이 groups()
group(int)
를 사용할 수 있다.
import re
result = re.match('(\d{2})-(\d{3,4})-(\d{4})', '02-123-1234')
print(result.groups())
print(result.group())
print(result.group(0))
print(result.group(1))
print(result.group(2))
# ('02', '123', '1234')
# 02-123-1234
# 02-123-1234
# 02
# 123
- 소괄호를 사용해 패턴을 체크하고 체크한 값을 변수로 저장해야만 위의 함수들을 사용할 수 있다.
아래는 소괄호를 전부 제거한 패턴인데 결과는 동일하지만 groups()
를 사용하지 못하는 모습
import re
result2 = re.match('\d{2}-\d{3,4}-\d{4}', '02-123-1234')
print(result2.groups())
print(result2.group())
# ()
# 02-123-1234
groupdict()
: groupdict()
를 사용하려면 패턴에 맞는 결과에 이름을 주어야한다. 패턴에 이름을 주려면 (?P<이름>)형식이 되어야만 한다. 여기서도 소괄호가 존재하지 않으면 에러가 발생한다.
import re
result = re.match('(?P<front>\d{2})-(?P<middle>\d{3,4})-(?P<rear>\d{4})', '02-123-1234')
print(result.groupdict())
print(result.groups())
print(result.group(1))
print(result.group('front'))
# {'front': '02', 'middle': '123', 'rear': '1234'}
# ('02', '123', '1234')
# 02
# 02
- 패턴
- 위 함수들의 가장 마지막 인자에는 패턴을 추가할 수 있으며, re 모듈은 아래와 같은 패턴을 지원한다.
I, IGNORECASE: 대소문자 구분 X
$()*+.?[]\^{}|
- 정규표현식에선 a는 문자 a와 매칭되지만 (는 (와 매칭되지 않는다. (가 메타 문자이기 때문이다.
- 이 때
\
백 슬래쉬를 쓰면 문자로 인식된다.\(
re.match(패턴, 문자열, 플래그)
는 문자열의 맨 앞 부터 시작해서 작성한 패턴이 일치하는지 확인한다.a
로 시작하는 매칭되는 문자에 대한 정보를 출력한다.'b'로 시작하므로, 매칭이 안된다.
re.search(패턴, 문자열, 플래그)
: match
와 유사하지만, 처음부터 일치하지 않아도 괜찮다.re.findall(패턴, 문자열, 플래그)
: 문자열 내 패턴
에 맞는 케이스를 전부 v찾아서 리스트로 변환한다.정규식에 매칭되는 문자열을 returnre.findall
과 유사하지만, 패턴에 맞는 문자열의 iterator를 반환한다.fullmatch(패턴, 문자열, 플래그)
는 문자열에 시작과 끝이 정확하게 패턴과 일치할 때 반환한다.match()
는 처음부터 패턴에 맞으면 반환하지만, 해당 함수는 시작과 끝이 정확하게 일치해야한다.
import re
print(re.fullmatch('a', 'a'))
print(re.fullmatch('a', 'aaa'))
print(re.fullmatch('a', 'ab'))
print(re.fullmatch('a', 'ba'))
print(re.fullmatch('a', 'baa'))
# <re.Match object; span=(0, 1), match='a'>
# None
# None
# None
# Noneimport re
import re
print(re.split('a', 'abaabca'))
print(re.split('a', 'abaabca', 2))
# ['', 'b', '', 'bc', '']
# ['', 'b', 'abca']
sub(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)
: sub
는 문자열에 맞는 패턴을 2번째 인자(교체할 문자열)로 교체한다.split의 최대 split 수와 동일하게 최대 교체 수를 지정하면, 문자열에 맞는 패턴을 교체할 문자열로 교체하고 그 수가 도달하면 더 이상 교체하지 않는다.
import re
print(re.sub('a', 'z', 'ab'))
print(re.sub('a', 'zxc', 'ab'))
print(re.sub('a', 'z', 'aaaab'))
print(re.sub('a', 'z', 'aaaab', 1))
# zb
# zxcb
# zzzzb
# zaaab
subn(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)
: 는 sub()
와 동작은 동일하나, 반환 결과가 (문자열, 매칭횟수)형태로 반환된다.import re
print(re.subn('a', 'z', 'ab'))
print(re.subn('a', 'zxc', 'ab'))
print(re.subn('a', 'z', 'aaaab'))
print(re.subn('a', 'z', 'aaaab', 1))
# ('zb', 1)
# ('zxcb', 1)
# ('zzzzb', 4)
# ('zaaab', 1)
compile(패턴, 플래그)
는 패턴과 플래그가 동일한 정규식을 여러번 사용하려면 compile()을 지정하여, 위의 함수들을 사용할 수 있다.import re
c = re.compile('a')
print(c.sub('zxc', 'abcdefg'))
print(c.search('vcxdfsa'))
# zxcbcdefg
# <re.Match object; span=(6, 7), match='a'>
purge()
를 호출하면 100개가 넘어가지 않아도 캐시를 초기화하는 함수이다.import re
re.purge()
escape()
는 패턴을 입력 받으면 특수문자들이 이스케이브(\
) 처리한 다음, 반환한다.import re
print(re.escape('(\d)'))
# \(\\d\)
findall()
을 제외하고 모든 한수들의 반환은 match object
로 반환된다.match object
에서는 group(), start(), end()
등과 같이 찾은 패턴이 문자열의 위치나 매칭 문자열을 반환하는 함수group()
, start()
, end()
, span()
search()
로 패턴에 맞는 문자열을 찾았다하면, group()
메서드를 통해 패턴에 맞는 문자열을 추출 할 수 있다.start()
를 사용해 문자열에서 어디서 부터, 패턴에 맞는 문자가 시작했는지end()
를 통해 어디까지 인지span()
으로 어디부터 어디까지 인지 확인 할 수 있다.import re
result = re.search('aa', 'baab')
print(result.group())
print(result.start())
print(result.end())
print(result.span())
# aa
# 1
# 3
# (1, 3)
groups()
,group(int)
: 만약 위와 같이 단순한 형태가 아닌, 소괄호 ()를 사용해 패턴을 묶는다면, 아래와 같이 groups()
group(int)
를 사용할 수 있다.import re
result = re.match('(\d{2})-(\d{3,4})-(\d{4})', '02-123-1234')
print(result.groups())
print(result.group())
print(result.group(0))
print(result.group(1))
print(result.group(2))
# ('02', '123', '1234')
# 02-123-1234
# 02-123-1234
# 02
# 123
아래는 소괄호를 전부 제거한 패턴인데 결과는 동일하지만
groups()
를 사용하지 못하는 모습import re
result2 = re.match('\d{2}-\d{3,4}-\d{4}', '02-123-1234')
print(result2.groups())
print(result2.group())
# ()
# 02-123-1234
groupdict()
: groupdict()
를 사용하려면 패턴에 맞는 결과에 이름을 주어야한다. 패턴에 이름을 주려면 (?P<이름>)형식이 되어야만 한다. 여기서도 소괄호가 존재하지 않으면 에러가 발생한다.import re
result = re.match('(?P<front>\d{2})-(?P<middle>\d{3,4})-(?P<rear>\d{4})', '02-123-1234')
print(result.groupdict())
print(result.groups())
print(result.group(1))
print(result.group('front'))
# {'front': '02', 'middle': '123', 'rear': '1234'}
# ('02', '123', '1234')
# 02
# 02
I, IGNORECASE: 대소문자 구분 X
L, LOCATE: \w, \W, \b, \B를 현재의 로케일에 영향을 받음
M, MULTILINE: 여러 줄의 문자열에 대해 패턴을 탐색할 수 있게 함
S, DOTALL: .을 줄바꾸기 문자도 포함하여 매치하게 함
U, UNICODE: \w, \W, \b, \B가 유니코드 문자 특성에 의존함
X, VERBOSE: 정규식 안의 공백 무시
위의 패턴은 아래와 같이 사용할 수 있으며 여러 패턴을 등록하려면 | 을 사용합니다.
import re
s = """
c
b
A
"""
print(re.search('a', s, re.M|re.I))
# <re.Match object; span=(5, 6), match='A'>
Author And Source
이 문제에 관하여(re - python regex), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@markyang92/module-re저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)