Regular Expression(정규표현식)

정규표현식: 특정한 규칙을 가진 <문자열>의 패턴 표현에 사용하는 형식 언어.


  • 메타문자

    메타 문자: 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자

    . ^ & * + ? {} [] \ | ()
    • 문자 클래스: []

      []: 내부 문자 중 한 개의 문자와 매치를 뜻함.

      [abc]: "a", "before"와 매치, 하나도 포함하지 않는 "depth"는 매치 X.

      [-]: from-to의 역할을 함.

      [a-zA-Z]는 알파벳 전체, [0-9]는 숫자까지.

      [^]: not이라는 뜻.

      [^0-9]: 숫자가 아닌 문자만 매치.

      • 자주 사용하는 문자 클래스

        \d: [0-9]. 숫자와 매치.

        \D: [^0-9].숫자가 아닌 문자와 매치.

        \s: [\t\n\r\f\v]. 공백문자(white space)와 매치.

        \S: [^ \t\n\r\f\v]. 공백문자가 아닌 문자와 매치.

        \w: [a-zA-Z0-9_]. 문자+숫자와 매치

        \W: [^a-zA-Z0-9_]. 문자+숫자가 아닌 문자와 매치


  • Dot: .

    .: 두 문자 사이 하나 이상의 어떤 문자가 하나 들어가도 매치.

    줄바꿈 문자 \n을 제외한 모든 문자와 매치됨.

    a.b: "a + 문자하나 + b"


  • 반복: *, +, {}, 그리고 ?

    *: 바로 앞 문자가 0부터 무한대(약 2억)로 반복될 수 있음.

    ca*t: ct, cat,caaaaaaaaaaaaat와도 매치 가능.

    +: 바로 앞 문자가 1번 이상 반복될 수 있음.

    ca+t: cat와 caaaaaat는 가능하지만 ct 문자는 매치 불가능.

    {}: 바로 앞 문자의 반복 수를 고정. {m,n}으로 구간 설정 가능.

    ca{2}t는 caat만 매치, ca{2,5}t는 a가 2~5회 반복 되는 경우 매치.

    ?: 앞 문자가 있어도, 없어도 된다는 뜻.

    {0, 1}과 같은 역할.


  • Or: |

    a|b: a 또는 b라는 의미.


  • 문자열의 처음: ^

    ^hi: 지정 문자열이 처음에 온 경우에만 매치.


  • 문자열의 끝: $

    bye$: 지정 문자열로 끝나는 경우에만 매치.


  • \A, \Z, \b, \B

    \A: ^와 동일하지만 MULTILINE 옵션 무시, 전체 문자열의 처음만 매치.

    \Z: $와 동일하지만 MULTILINE 옵션 무시, 전체 문자열의 끝과만 매치.

    \b: 단어 구분자, 보통 whitespace에 의해 구분.

    /bclass/b: whitespace로 구분된 class 단어만 매치.

    백스페이스로 이해할 수 있으니 raw string 표시 r''로 표현.

    \B: \b와 반대로, whitespace로 구분되지 않은 단어인 경우만 매치.


  • Grouping: ()

    (): 그룹을 만들어주는 메타 문자.

    m.group(n): n번째 그룹에 해당되는 문자열 뽑아냄.

    n=0인 경우, 매치된 전체 문자열.

    \2: 그루핑한 문자열을 재참조하는 메타문자로, n번째 그룹을 가리킴.

    (?P<name>\w+): 그룹에 이름을 지어줌.

    참조: m.group('name')

    재참조: (?P=name)


  • re: 정규식을 이용한 문자열 검색

    re.split(' ', text): text 문자열을공백 기준으로 분리하여 리스트로 반환.

    re.compile('[a-z]+'): 정규 표현식을 컴파일 함.

    컴파일된 패턴 객체 p를 사용하여 작업 수행.

    re.match('python'): 문자열의 처음부터 정규식과 매치되는지 조사.

    맨 앞이 매치되지 않으면 None. 중간에 끊기면 중간까지.

    re.search(): 문자열 전체를 검색하여 정규식과 매치되는지 조사.

    match와 같지만, 맨 앞이 매치되지 않아도 다음 문자열을 계속 검색함.

    re.findall(): 정규식과 매치되는 모든 문자열을 리스트로 돌려줌.

    re.finditer(): 정규식과 매치되는 모든 문자열을 반복가능한 객체로 돌려줌.

    findall과 동일하지만, 반복 가능한 객체를 돌려줌

    for r in result: print(r)

    re.sub('[]', ' ', text): text 문자열에서 표현식에 맞는 내용을 빈칸으로 대체.

    축약하기: re.match(‘[a-z]+', ‘python')

    한 번 만든 패턴 객체를 여러번 사용할때 편리함.


  • match 객체의 메서드

    m.group(): 매치된 문자열을 돌려줌.

    m.start(): 매치된 문자열의 시작 위치를 돌려줌.

    search 메서드를 사용하면 값이 0과 다르게 나올 것.

    m.end(): 매치된 문자열의 끝 위치를 돌려줌.

    m.span(): 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려줌.


  • 컴파일 옵션

    re.compile('a.b', re.S)와 같은 방식으로 사용함.

    re.DOTALL: dot(.)이 줄바꿈 문자를 포함한 모든 문자와 매치할 수 있게 함.

    == re.S

    re.IGNORECASE: 대소문자와 관계없이 매치할 수 있게 함.

    == re.I

    re.MULTILINE: 여러 줄과 매치 가능하게 함. ^와 $ 사용과 관계 있는 옵션.

    ^와 $ 메타 문자를 문자열의 각 줄마다 적용해주는 것.

    == re.M

    re.VERBOSE == re.X


전방 탐색, sub 메서드 등등 많이 있음…