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.)