위키북스 박응용 저 "점프 투 파이썬" 책을 읽고 정리한 내용입니다.

다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.

문자 클래스

  • [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중에서 조건에 부합하는 부분이 있는지 검토하게 되는 것이다