[파이썬] 정규표현식 정리

 
Feb 13, 2023

Contents


 
💡
출처: https://wikidocs.net/4309

메타 문자 (meta characters)

. ^ $ * + ? { } [ ] | ( ) 가 있다.

문자 클래스 [ ]

  • [] 사이에 있는 문자들과 일치하는 문자열을 찾는다.
  • - 을 안에 쓰면 범위를 지정할 수 있다. (From-To)
    • ex) [A-Z], [a-z], [0-9], [a-zA-Z], [A-Z0-9]
  • ^ 문자는 NOT 연산자를 의미한다. 따라서, 안에 ^ 문자가 다른 문자 앞에 들어간다면 그 문자는 탐색하지 않음을 뜻한다.

자주 사용하는 문자 클래스

  • 공통적으로, 대문자는 소문자가 하는 역할의 반대 역할이다.
  • \d : [0-9] 와 동일한 연산으로, 숫자를 찾는다.
  • \D : [^0-9] 와 동일한 연산으로, 숫자가 아닌 문자를 찾는다.
  • \s : [ \t\n\r\f\v] 와 동일한 연산으로, whitespace 문자를 찾는다.
  • \S : [^ \t\n\r\f\v] 와 동일한 연산으로, whitespace 문자가 아닌 문자를 찾는다.
  • \w : [a-zA-Z0-9_] 와 동일한 연산으로, 문자 및 숫자를 찾는다.
  • \W : [^a-zA-Z0-9_] 와 동일한 연산으로, 문자 및 숫자가 아닌 문자를 찾는다.

Dot (.)

  • 개행 문자 \n 을 제외한 모든 문자를 찾는다. ex) a.b -> a + (제외한 모든 문자) + b 탐색
    • (주의) 문자 클래스를 나타내는 [ ] 안에 . 를 쓰면 . 문자 하나만 찾는다. 모든 문자를 찾고자 한다면 대괄호로 감싸지 말 것

반복 (*)

  • 앞에 붙은 문자가 0개 이상 반복되는 문자열을 찾는다. (없어도 된다는 뜻) ex) ca*t -> ct, caaat, cat, caaaaaaaat 모두 match

반복 (+)

  • 앞에 붙은 문자가 1개 이상 반복되는 문자열을 찾는다. (적어도 하나는 있어야 함) ex) ca*t -> caaat, cat, caaaaaaaat 모두 match되지만, ct는 match되지 않는다.

반복 ({m,n})

💡
m,n은 붙여 써야 한다.
  • {} 앞에 오는 문자가 m개 이상, n개 이하 반복되는 문자열을 찾는다. (개수 범위 조절 가능) ex) ca{2,5}t -> caat, caaat, caaaat, caaaaat 모두 match되지만, cat는 match되지 않는다.

반복 (?)

  • ? 앞에 오는 문자가 있어도 되고, 없어도 되는 optional한 조건을 붙일 때 쓴다. ex) ca?t -> ct, cat 모두 match되지만, caat는? None

정규식으로 문자열 검색하기

  1. match() : 문자열의 처음부터 정규식과 매치되는지 조사한다.
      • 정규식과 매치되는지 맨 앞부터 체크하기 때문에, 처음부터 안 맞으면 매치 실패로 간주된다.
  1. search() : 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
      • 일치하는 패턴이 시작되는 부분부터 체크한다. 체크가 끝나면 작업을 종료한다.
  1. findall() : 정규식과 매치되는 모든 substring을 리스트로 리턴한다.
  1. finditer() : 정규식과 매치되는 모든 substring을 iterator 객체로 리턴한다.

match 객체의 메서드

  1. group() : 매치된 문자열을 리턴한다. (getter) ex) ‘3 python’ -> ‘python’
  1. start() : 매치된 문자열의 시작 인덱스를 리턴한다. ex) 2
  1. end() : 매치된 문자열의 끝 인덱스를 리턴한다. ex) 8
  1. span() : 매치된 문자열의 (시작, 끝)에 해당되는 튜플을 리턴한다. ex) (2, 8)

정규식 컴파일 옵션

  • re.compile(‘<정규식>’, ‘<옵션>’) 형식으로 컴파일 옵션을 부여할 수 있다.
  • 컴파일 옵션 목록은 다음과 같다. 괄호 안에 있는 문자는 약어로, 앞에 있는 문자열을 대신에 쓸 수 있다.
    • DOTALL(S) : . 정규식이 개행 문자 포함한 모든 문자와 매치할 수 있도록 한다.
      • ^ : 문자열의 처음을 의미
      • $ : 문자열의 을 의미
    • IGNORECASE(I) : 대소문자에 관계없이 매치할 수 있도록 한다.
    • MULTILINE(M) : 여러 줄과 매치할 수 있도록 한다. (^, $ 메타문자 관련하여 유용하다.)
    • VERBOSE(X) : verbose 모드를 사용할 수 있도록 한다. (여러 줄을 사용할 수 있고, 주석 등을 사용할 수 있다.)

그 외 메타문자들

  • | : 정규식들 간 OR 연산
  • ^ : ^ 뒤에 있는 문자열이 문자열의 처음인지 찾을 때 쓴다. re.MULTILINE 옵션이 적용되어 있다면 여러 줄일 떄 각 줄이 따로 탐색된다.
  • $ : $ 앞에 있는 문자열이 문자열의 끝인지 찾을 때 쓴다.
  • \A : 문자열의 처음과 매치되는지 찾을 때 쓴다. ^와 달리, re.MULTILINE 옵션이 적용되어도 전체 문자열의 처음부터만 비교한다.
  • \Z : 문자열의 끝과 매치되는지 찾을 때 쓴다. $와 달리, re.MULTILINE 옵션이 적용되어도 전체 문자열의 처음부터만 비교한다.
  • \w : 단어 구분자로, 들어간 자리는 일반적으로 whitespace 문자다. 이러한 whitespace로 단어가 구분되어 있는지 찾을 때 쓴다.
  • \W : 반대로, 들어간 자리에 whitespace가 있지 않아 구분되지 않은 단어를 찾을 때 쓴다.

그루핑

  • ()로 문자열을 둘러싸, 둘러싸인 문자열이 반복되는지와 같은 상황에서 정규식을 작성할 수 있다.

전방 탐색

  • 특정 문자열로 제한하여 간단히 탐색 후 문자열 소비 가능
    • 긍정형 전방 탐색: ?=<문자열>
    • 부정형 전방 탐색: ?!<문자열>

문자열 바꾸기

  • re는 미리 정규식으로 컴파일되어 있어야 한다.
  • re.sub(<새로 대체할 문자열>, <적용할 문자열>, <(선택) count>)

Greedy와 Non-greedy

  • Greedy: 정규식에 맞으면 모든 문자열을 소비함
  • Non-greedy: 정규식 맨 뒤에 ?를 추가하면 가장 먼저 충족하는 문자열까지만 소비한다.