분석 또는 개발을 진행하면서 특정 규칙에 해당하는 문자열을 추출해야 할 경우가 가끔씩 생긴다. 자연어 분석을 메인으로 하지 않는다면 그 빈도가 어쩌다 한 번이다 보니 그때그때 정규 표현식 내용 확인 및 예제를 찾아보는데 시간을 들이게 된다. 그 시간을 줄여보고자 정규표현식과 파이썬에서의 적용에 대해 정리한다.
정규식 문법
Meta 문자
- 정규 표현식에서 사용되는 기호를 뜻함. 표현식에서 내부적으로 특정 의미를 가지는 문자를 말함.
- 예약어로 이해
^x : 문자열의 시작. x문자로 시작됨을 의미
p = re.compile('^@')
msg = p.search('@ssesaa.')
print(msg.string)
@ssesaa.
x$ : 문자열의 종료. x문자로 종료됨을 의미
p = re.compile('@$')
msg = p.search('ssesaa.@')
print(msg.string)
ssesaa.@
.x : 임의의 한 문자의 자릿수 표현. 문자열이 x로 끝나는 것을 의미
x+ : 반복을 표현. x문자가 한번 이상 반복됨
p = re.compile('@#+')
msg = p.search('@swe a@##')
print(msg.string)
@swe a@##
x? : 존재 여부를 표현. x문자가 존재할 수도, 존재하지 않을 수도 있음을 의미
p = re.compile('@#?')
msg = p.search('@swe a#')
print(msg.string)
@swe a#
x|y : or을 표현. x 또는 y문자가 존재함을 의미
p = re.compile('sas|saf')
msg = p.search('saflls')
print(msg.string)
saflls
(x) : 그룹을 표현. x를 그룹으로 처리
(x)(y) : 그룹들의 집합을 표현. 앞에서부터 순서대로 번호를 부여해서 관리
(x)(?:y) : 그룹들의 집합에 대한 예외. 그룹 집합으로 관리되지 않음을 의미
x{n} : 반복을 표현. x문자가 n번 반복
x{n,} : 반복을 표현. x문자가 n번 이상 반복
x{n,m} : 반복을 표현. x문자가 최소 n번 이상, 최대 m번 이하로 반복
Meta 문자의 특수 케이스
[xy] : 문자 선택을 표현. x, y 중에 하나
[^xy] : not을 표현. x 및 y를 제외한 문자를 의미
[x-y] : range를 표현. x~z 사이의 문자를 의미
\^ : escape. ^를 문자로 사용
\b : word boundary. 문자와 공백 사이의 문자
\B : non word boundary. 문자와 공백 사이가 아닌 문자
\d : digit, 숫자를 의미
\D : non digit. 숫자가 아닌 것을 의미
\s : space. 공백 문자를 의미
\S : non space. 공백 문자가 아닌 것을 의미
\t : tab. 탭 문자
\v : vertical tab. 수직 탭
\w : word. 알파벳+숫자+_ 중의 한 문자
\W : non word. 알파벳+숫자+_ 가 아닌 문자를 의미
Flag
Flag를 사용하지 않으면 문자열에 대한 검색을 단일로 처리하고 종료
g : global. 대상 문자열 내의 모든 패턴 검색
i : ignore case. 대상 문자열에 대해 대/소문자 식별하지 않음
m : multi line. 대상 문자열이 다중 라인이어도 검색
파이썬 사용
re.compile(pattern, flags=0) : 정규식 패턴을 정규식 객체로 컴파일. 정규식이 단일 프로그램에서 여러 번 사용 시 compile을 사용하고 결과 정규식 객체를 사용하는 것이 효율적
p = re.compile('^asf')
m = p.match('asfees')
print(m.string)
re.search(pattern, string, flags=0) : string을 통해 스캔, pattern이 일치하는 첫 번째 위치를 찾아 대응하는 일치 객체 반환.
p = re.compile('^asf')
m = re.search(p, 'asfees')
print(m.string)
re.match(pattern, string, flags=0) : string 시작 부분에서 0개 이상의 문자가 정규식 pattern과 일치하면 해당 일치 객체를 반환.
re.fullmatch(pattern, string, flags=0) : 전체 string이 정규식 pattern과 일치하면 해당하는 일치 객체 반환.
re.split(pattern, string, maxsplit=0, flags=0) : string을 pattern으로 나눔.
re.split(r'\W+', 'Words, words, words.')
re.split(r'(\W+)', 'Words, words, words.')
re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
re.finditer(pattern, string, flags=0) : string에서 겹치지 않는, RE pattern의 모든 일치를 일치 객체를 산출하는 이터레이터로 반환
re.escape(pattern) : pattern에서 특수 문자를 이스케이프 처리.
print(re.escape('https://www.python.org'))
https://docs.python.org/ko/3/library/re.html
'Programming' 카테고리의 다른 글
파이썬 로그 핸들링 (0) | 2022.08.01 |
---|---|
파이썬 예외처리 (0) | 2022.08.01 |
Black을 이용한 코드 스타일 맞추기 (0) | 2022.07.14 |
[Library] Dask 추가 정보 및 테스트 (0) | 2022.07.10 |
[Library] Dask? Spark? (0) | 2022.07.05 |