위키북스 박응용 저 "점프 투 파이썬" 책을 읽고 정리한 내용입니다.
다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.
문자 클래스
[abc]
: a, b, c중 하나라도 있으면 매치[a-e]
: a부터 e까지(a, b, c, d, e)중 하나라도 있으면 매치(from-to)[^abc]
: a, b, c중 하나라도 있으면 매치되지 않음(not)- 어떤 메타기호던지
^
와-
를 제외하면[]
안에 검색조건으로 넣을 수 있다 []
: 특정 문자를 찾거나 특정 문자를 배제할 때 주로 사용된다
\
정규식
- 여기 있는것들은 대문자로 쓰면 not 의 의미가 된다
\d
: digit = 숫자와 매치.[0-9]
와 같음\s
: space = 스페이스처럼 눈에 안보이는 문자들과 매치\w
: word = 숫자/알파벳과 매치\b
: 단어경계(알파벳과 숫자가 아닌 부분)을 조사함\babc
: abc로 시작하는 단어를 매칭
\
정규식 (심화)
\A
:re.MULTILINE
와 상관없이 문자열의 맨 처음만 조사함\Aabc
: 문자열이abc
로 시작하면 매칭
\Z
:re.MULTILINE
와 상관없이 문자열의 맨 끝만 조사함abc\Z
: 문자열이abc
로 끝나면 매칭
\W
는 숫자,알파벳이 아닌 부분을 찾아 매치해 소비하고 결과로 반환하지만\b
는 그 부분을 조사할 뿐 숫자,알파벳이 아닌 부분을 소비해 결과로 반환하지는 않는다\A
,\Z
도 마찬가지로 조사에는 반영되지만 소비되어 결과로 반환되지는 않는다\A
와^
,\Z
와$
의 차이점은re.MULTILINE
의 영향을 받냐 안받냐 이다.^
와$
의 경우 옵션을 주면 줄마다 처음이나 끝을 조사하지만,\A
와\Z
는 옵션을 줘도 문자열의 맨 처음/끝만 조사한다
문자열의 맨 처음과 끝 조사하기
^
: 문자열의 맨 처음을 조사함.re.MULTILINE
옵션을 주면 줄바꿈된 모든 줄의 시작점을 조사한다^abc
: 문자열이abc
로 시작하면 매칭
$
: 문자열의 맨 끝을 조사함.re.MULTILINE
옵션을 주면 줄바꿈된 모든 줄의 끝점을 조사한다abc$
: 문자열이abc
로 끝나면 매칭
DOT 메타기호
.
: 모든 문자와 매칭a.b
: acb, adb, a b 등 a와 b사이에\n
이 아닌 어떠한 문자가 와도 매칭된다\n
도 넣고싶다면 컴파일 옵션으로re.DOTALL
을 넣으면 된다
반복
ab*c
: ac, abc, abbc 등 b가 0번 이상 반복되면 매치ab+c
: abc, abbc, abbbc등 b가 1번이상 반복되면 매치ab{2,4}c
: abbc, abbbc, abbbbc처럼 b가 2~4번 반복되면 매치ab?c
: ac, abc처럼 b가 0번이나 1번 등장하면 매치{,}
처럼 인자를 생략할 수도 있다. 앞을 생략하면 0, 뒤를 생략하면 무한대이다
OR연산
abc|def
: abc나 def가 등장하는 부분과 매치
그루핑
(abc)
: 그루핑 - 여러 정규식들을 소괄호로 묶는 것(abc)+
: abcabcabc같이 abc가 반복되는 부분을 매치
그룹 인덱스
(그룹1)(그룹2(그룹3))
- 왼쪽에서 오른쪽으로, 밖에서 안으로 그룹 인덱스가 매겨진다
([a-z]+)\s+(\w+)
에서([a-z]+)
: 1번 그룹(\w+)
: 2번 그룹
- 매치객체의
group()
매소드에 인자로 그룹 번호를 넣어주면 해당하는 그룹에 매치된 결과만 소비할 수 있다
그룹 재참조
\숫자
: “숫자”에 해당하는 번째의 그룹을 재참조한다"abc def ghi ghi"
를"(\w+)\s+\1"
정규식으로 매치해보면"ghi ghi"
가 매치된다.- 즉, 어떤 그룹에 매치된 문자열과 동일한 문자열이 또 등장하면 그룹 재참조로 매치할 수 있다
그룹 네이밍
(?P정규식)
을 통해 그룹을 인덱스로 접근하지 않고 키를 통해 접근할 수도 있다- 이때에는
group("그룹명")
이렇게 메소드의 인자로 키를 넣어주면 된다 - 재참조할때는
(?P=그룹명)
이렇게 해주면 된다
전방 긍정/부정 탐색
(?=정규식)
: 정규식과 부합하는 부분을 검거(?!정규식)
: 정규식과 부합하지 않는 부분을 검거- 전방 긍정/부정 탐색의 경우 기본적으로 소비되지 않는다. 즉, 검색조건에는 들어가지만 검색결과에 안나오고 다음검색시 제외되지도 않는다는 말이다
헷갈리지 말자
^
^정규식
:문자열의 맨 처음부터 조사[^문자]
: 해당 문자가 없는지 조사
?
ab?
: b가 0번이나 1번 등장하는지 조사(?)
: 그루핑 확장기호/전방탐색ab*?
: non-greedy로 작동하게 함
Greedy 한 메타기호란?
- 어떤 메타기호가 Greedy하다는 것은 이놈이 최대한 많은 문자들을 소비하려고 한다는 것 이다
- Greedy한 메타기호는
*
와+
가 있다.- 정규식
"a.*c"
을"abcabcabc"
의 문자열에 대입하면"abc"
도 있지만 제일 많은양을 소비할 수 있는"abcabcabc"
를 소비하게 된다
- 정규식
- 이것을 막으려면
*
와+
뒤에?
를 붙여주는 것이다. 이것을 붙여주면 최대소비가 아닌 최소소비가 되어 제일 적은양을 소비하는 선택지를 검거 할 것이다- 위의 정규식을
"a.*?c"
로 바꿔주면"abcabcabc"
의 문자열에 대입했을 때"abc"
가 매치되게 된다
- 위의 정규식을
매칭? 소비?
- 매칭 : 문자열의 특정 부분이 정규식의 조건에 부합하여 검거 하는 것
- 소비 : 문자열의 특정 부분이 매칭되면 그부분은 없다고 생각하고 다음 매치를 찾는다
- 예를들어 “abcdef”중에서 조건에 부합하여 검거의 대상이 되는 곳이 abc와 bcd라고 해보자
- 그러면 먼저 abc를 먼저 매칭할 것이다
- 그다음에 다시 매치를 시도해보면 bcd가 매치될거라고 생각하겠지만 bcd는 매치되지 않는다
- 왜냐하면 이미 abc가 매치되어서 소비되었기 때문에 남은 def중에서 조건에 부합하는 부분이 있는지 검토하게 되는 것이다