Data/Information

정규표현식 python re

neulvo 2022. 4. 22. 08:23
 

정규식 HOWTO — Python 3.10.4 문서

대소 문자를 구분하지 않는 일치를 수행합니다; 문자 클래스와 리터럴 문자열은 대소 문자를 무시하여 문자와 일치합니다. 예를 들어 [A-Z]는 소문자와도 일치합니다. ASCII 플래그로 ASCII가 아닌

docs.python.org

 

Regular Expression HOWTO — Python 3.10.4 documentation

Perform case-insensitive matching; character class and literal strings will match letters by ignoring case. For example, [A-Z] will match lowercase letters, too. Full Unicode matching also works unless the ASCII flag is used to disable non-ASCII matches. W

docs.python.org


정규표현식에 대한 위의 문서를 정리하고자 한다.

위에는 한국어, 아래는 영어.

여기서는 re 모듈이 아닌 정규식 표현에 대해서 더 중점적으로 다루고자 한다.

re 모듈에 대해선 아래의 링크를 참조.

 

re - 정규식 연산

re — 정규식 연산 — Python 3.10.4 문서 re — 정규식 연산 소스 코드: Lib/re.py 이 모듈은 Perl에 있는 것과 유사한 정규식 일치 연산을 제공합니다. 패턴과 검색 할 문자열은 모두 유니코드 문자열(str)

neulvo.tistory.com

 

 

메타 문자 표

메타 문자 및
특수 기호
설명 Ex 및 동일 표현
[ ] 일치시키려는 문자 집합인 문자클래스를 지정하는 데 사용
\ 를 제외한 다른 메타문자들은 문자클래스 안에서 메타문자로 기능하지 않음
[가-힣], [a-z], [0-9]
- 두 문자를 주고 '-'로 구분하여 문자의 범위를 나타낼 수 있음 [abc] == [a-c]
[^ ] 클래스의 첫번째 문자로 '^'를 포함해 클래스에 나열되지 않은 문자를 일치시킬 수 있음 [^0-9] ==
숫자를 제외한 모든 문자
^ 줄의 시작 부분에 일치 re.search('^From', 'From Here to Eternity')
$ 줄의 끝부분과 일치 re.search('}$', '{block}')
\ \ 다음에 다양한 특수 시퀀스를 알리는 다양한 문자가 따라올 수 있음.
또한, 모든 메타 문자를 이스케이프 처리하여 패턴으로 일치시킬 수 있게 함
\\, \[
. 개행 문자를 제외한 모든 문자와 일치, re.DOTALL로 모든 문자와 일치할 수 있음  
* (greedy) 이전 문자를 0번 이상 일치시킬 수 있도록 지정 ca*t == ct, cat, caaat, ...
+(greedy) 이전 문자를 1번 이상 일치시킬 수 있도록 지정 ca+t == cat, caaat, ...
?(greedy) 한 번이나 0번 일치 home-?brew ==
homebrew, home-brew
*?, +?, ??
{m, n}?
(non-greedy)
최소 방식으로 일치를 수행, 가능하면 적은 문자가 일치, 아래 설명  
{m} 정확히 m 반복 a{6} == 'aaaaaa'
{m,n} 적어도 m 반복, 최대 n 반복 a/{1,3}b ==
a/b, a//b, a///b
{0,} == *
{1,} == +
{0,1} == ?
( ) 그룹, 내부에 포함된 표현식을 함께 묶고
*, +, ? 또는 {m,n}과 같은 반복 한정자로 그룹의 내용을 반복 할 수 있음
'(ab)*' = ab를 0번 이상 반복한 것에 일치
\숫자 패턴의 역참조, 아래 설명  
(?:...) 비 포착 그룹, 아래 설명  
(?P<name>...) 이름 있는 그룹, 아래 설명  
(?P=name) 이름 있는 그룹에 대한 역참조, 아래 예시  
\g<name>  \g<number> 이름 있는 그룹 참조, 아래 설명  
(?#...) 주석, 괄호의 내용은 단순히 무시됨  
(?=...) 긍정적인 미리보기 어서션
현재 위치에서 성공적으로 일치하면 성공하고, 그렇지 않으면 실패
Isaac (?=Asimov) ==
Asimov가 뒤따를 때만 Isaac과 일치
(?!...) 부정적인 미리보기 어서션
포함된 정규식이 문자열의 현재 위치에서 일치하지 않으면 성공
bat, exe 확장자 제외 ==
.*[.](?!bat$|exe$)[^.]*$
(?<=...) 긍정적인 되돌아보기 어서션
문자열의 현재 위치 앞에 현재 위치에서 끝나는 ...와의 일치가 있으면 일치
re.search('(?<=abc)def', 'abcdef') ==
'def'
(?<!...) 부정적인 되돌아보기 어서션
문자열의 현재 위치 앞에 ...와의 일치가 없으면 일치
 
| 대안, 또는 “or” 연산자
A와 B가 정규식이면, A|B는 A나 B와 일치하는 문자열과 일치
Crow|Servo ==
Crow, Servo
(?aiLmsux) 해당 플래그를 전체 정규식에 대해 설정, 플래그에 대해선 아래 설명
플래그는 정규식 문자열에서 처음에 사용해야 함.
 
(?aiLmsux-imsx:...) 해당 플래그를 정규식의 일부에 대해 설정하거나 제거  

 

특수 시퀀스 표

특수 시퀀스 목록 설명 Ex 및 동일 표현
\ \ 다음에 다양한 특수 시퀀스를 알리는 다양한 문자가 따라올 수 있음.
또한, 모든 메타 문자를 이스케이프 처리하여 패턴으로 일치시킬 수 있게 함
\\, \[
\d 모든 십진 숫자와 일치 \d == [0-9]
\D 모든 비 십진 숫자 문자와 일치 \D == [^0-9]
\s 모든 공백 문자와 일치 \s == [ \t\n\r\f\v]
\S 모든 비공백 문자와 일치 \S == [^ \t\n\r\f\v]
\w 모든 영숫자와 일치 \w == [a-zA-Z0-9_]
\W 모든 비 영숫자와 일치 \W == [^a-zA-Z0-9_]
\A 문자열의 시작 부분에서만 일치  
\Z 문자열의 끝부분에서만 일치  
\b 단어 경계, 단어(word)의 시작이나 끝부분에서만 일치하는 폭이 없는 어서션  
\B 또 다른 폭이 없는 어서션
\b의 반대이며, 현재 위치가 단어 경계에 있지 않을 때만 일치
 

 

Raw 문자열 표기법(Raw String Notation)

r" ", 백 슬래시 이스케이프 문제를 처리하기 위해 사용.

문자 단계
\section 일치시킬 텍스트 문자열
\\section re.compile()을 위해 이스케이프 처리된 백 슬래시
"\\\\section" 문자열 리터럴을 위해 이스케이프 처리된 백 슬래시
일반 문자열 Raw 문자열
"ab*" r"ab*"
"\\\\section" r"\\section"
"\\w+\\s+\\1" r"\w+\s+\1"

 

컴파일 플래그

정규식의 작동 방식을 수정하는 데 사용. | (OR) 을 사용해 다중 플래그 사용 가능. ex)re.I | re.M

플래그 의미
ASCII, A \w, \b, \s 및 \d와 같은 여러 이스케이프가 해당 속성이 있는 ASCII 문자에만 일치하도록 함
DOTALL, S .가 개행 문자를 포함한 모든 문자와 일치하도록 함
IGNORECASE, I 대소 문자 구분 없는 일치를 수행
LOCALE, L \w, \W, \b, \B 및 대소 문자를 구분하지 않는 일치를 유니코드 데이터베이스 대신 현재 로케일에 의존하도록 만듦
다른 로케일/언어를 처리할 수 있음
MULTILINE, M 다중 행 일치, 문자열 뿐만 아니라 문자열 내 줄 바꿈까지 고려, ^와 $에 영향을 줌
VERBOSE, X (‘확장’ 용) 더 명확하고 이해하기 쉽게 정리될 수 있는 상세한 RE를 활성화
문자 클래스에 있거나 이스케이프 되지 않은 백 슬래시 뒤에 있을 때를 제외하고, RE 문자열 내의 공백을 무시

 

문서의 캡쳐본

 

비 포착 그룹과 이름 있는 그룹, 역참조 문법

비 포착 그룹의 사용 : (?:...)

이름 있는 그룹의 사용 : (?P<name>...)

역참조 문법 : 패턴의 역참조를 사용하면 이전 포착 그룹의 내용이 문자열의 현재 위치에서도 발견되어야 한다고 지정할 수 있음. 예를 들어, \1은 그룹 1의 정확한 내용이 현재 위치에서 발견되면 성공하고, 그렇지 않으면 실패.

중복을 감지하는 역참조 문법 코드
위의 역참조 문법 코드와 동일한 표현의 이름 있는 그룹 표현

이름 있는 그룹 참조 : \g<name> / \g<number>

역참조와 이름 있는 그룹 참조의 활용

 

Greedy와 Non-Greedy 비교

Greedy
Non-greedy

 

참고

re 모듈을 사용하기 전에, 더 빠르고 간단한 문자열 메서드로 문제를 해결할 수 있는지 고려하라.

문자열은 고정 문자열을 사용하는 연산을 수행하는 몇 가지 메서드를 가지고 있으며, 대개 훨씬 빠릅니다. 더 크고, 더 일반화된 정규식 엔진 대신, 구현이 목적에 맞게 최적화된 단일하고 작은 C 루프이기 때문입니다. (문서 발췌)

ex) replace, translate

 

728x90