RegEx

newhyork·2022년 7월 4일
0

regular expression

  • 한 문자열 내부에서 특정 패턴에 해당되는 문자(열)만 필요로 할 때,
    정규식을 이용한 패턴을 적용하여 원하는 형식의 문자(열)만 골라낼 수 있다.
  • 정규식 패턴에서 ^ $ * + ? { } \ | ( ) 등의 특수 문자는
    기본적으로 본래 문자로써 그대로 사용되지 않고, 특별한 기능을 한다.
    이를 meta character라 한다.

pattern


  • 패턴은 문자열로 나타낸다.
  • 일반적으로, 대상 문자열에서 패턴에 매치되는 부분만 추출한다.
    • 그룹핑 등을 통해, 매치되는 부분에서도 원하는 부분만 추출할 수도 있다.

barckets [ ]

  • character class라 한다.
  • 어떤 문자 범위를 대상으로 문자 하나에 매칭시킬지를 [ ] 안에 작성한다.
  • 하이픈(-)을 이용하여 범위를 간단하게 나타낼 수 있다.
    (단, unicode 상의 순서에 맞게 작성해야 한다.)
    • [0-9]: 숫자
    • [a-zA-Z]: 알파벳 대소문자
  • ^: 문자 클래스 내부에서 쓰일 때는, 이 이하로 작성된 것들의 반대를 의미한다.
    • [a-z^aeiou]: 알파벳 소문자 중 모음 제외
    • [^AEIOUaeiou_\W\d]: A,E,I,O,U, a,e,i,o,u, 밑줄, 문자가 아닌 것, 숫자를 전체 부정한다. (자음)
    • 유일하게 ^만 해당되며,
      다른 메타 문자는 문자 클래스 내에서 문자로써 그대로 사용할 수 있다.

caret ^

  • 문자 클래스 내부에서와 달리 패턴에서 쓰이면,
    대상 문자열이 특정 문자로 시작해야 매치되도록 한다.

dollar sign $

  • ^과 반대로, 특정 문자로 끝나면 매치되도록 한다.

dot .

  • \n(줄 바꿈)을 제외한 모든 문자와 매치한다.

back slash \

  • 메타 문자를 문자 그대로써 사용하기 위해서는, 문자 바로 앞에 \을 붙여줘야 한다.
    • 이처럼 패턴 내에서 \을 사용해야 할 일이 있다면
      다음과 같은 이유로 인해 패턴 앞에 raw string(r)을 붙여 나타내는 것이 간편하다.
      • Python은 문자열로 \를 나타낼 때, ‘\\’을 입력해야 한다.
      • 정규식 엔진에 ‘\메타 문자’가 전달될 수 있도록,
        정규식 패턴(문자열)에서는 ’\\\메타 문자’로 해야 한다.
      • 참고로 \d, \s, \w는 상관 없으며, 그 외에 \b 등은 마찬가지로 해당된다.
  • 패턴이나 문자 클래스 내에서 다음을 나타내기 위해 자주 쓰인다.
    만약 대문자를 사용한다면, 각각 그 의미에 반대된다.
    • \d: 숫자
    • \s: space나 tab 등, 공백을 의미하는 white space
    • \w: 문자, 숫자, 밑줄
  • \b: 단어의 경계를 의미한다. 즉, white space로 구분된 단어와 매치할 때 사용한다.
    (\B는 그 반대이다.)
    • "Life is short, isn't it?” 일 때,
      패턴이 ‘\\bis\\b’ 이면 is와, ‘is\\B’이면 isn’t의 is와 매치된다.

quantifier


asterisk *

  • 0개 이상

plus sign +

  • 1개 이상

question mark ?

  • 0개 또는 1개
  • non-greedy 하다는 특징이 있다.
    • 수량자인 * 등을 *? 등으로, greedy한 것들을 제한하고자 할 때 사용한다.
      대상 문자열에 대해, 패턴을 최소한으로 만족하는 것을 기준으로 매칭한다.
    • ‘<html><head>’이 대상 문자열로 주어졌을 때
      <.*>을 하면 전체 문자열로써 매치되고,
      <.*?>을 하면 각각 <html>, <head>로 나누어 매치된다.

braces { }

  • {n}: 정확히 n개
  • {min,max}: 최소, 최대.
    • 각각 한 쪽 씩 생략하여 나타낼 수도 있다. 이 때, comma는 그대로 둔다.

vertical bar |


  • ‘또는’ 을 의미한다.

group


  • 그룹을 지을 때는 parentheses ( ) 를 사용한다.
  • 대상 문자열에서 패턴에 매치된 부분에 대해,
    그룹핑한 부분만 추출하고자 할 때 사용한다.
  • 그룹 내 그룹 따위로, 중첩할 수도 있다.

re-reference

  • 그룹은 패턴 내에서 \1(1번째 그룹) 따위로 재참조 할 수 있다.
    • 패턴 자체를 재활용하여 사용하는 것이 아니라,
      앞서 그룹에 매치된 문자열과 똑같은 문자열이 쓰였을 때 등에 매치하는 것이다.
  • 그룹에 이름을 붙이고 싶다면, 앞 부분에 ?P<group_name>으로 지정할 수 있다.
    • 패턴 내에서 해당 그룹을 재참조할 때는, ?P=group_name으로 참조할 수 있다.

non-capturing

  • 패턴의 그룹핑된 부분만이 아니라 나머지 매칭된 부분도 함께 추출하고 싶다면,
    앞 부분에 ?: 을 붙이도록 한다.
  • 대신, 그룹의 재참조는 불가능해진다.

look-ahead


  • ( )를 사용하지만, 그룹핑은 아니다.

positive

  • (?=~): 매치 여부로는 활용하지만, 추출(소비)하지는 않을 때 사용한다.
    • ~에 해당하는 부분 패턴이 매치되어야 한다.
  • ‘http://www.google.com’의 ‘http:’에서, ‘:’을 제외하고 ‘http’만 추출할 때 등에 유용하다.
    • 이 때, 패턴은 ‘.+(?=:)’ 등으로 할 수 있다.

negative

  • (?!~): 특별히 원하지 않는 문자열을 필터링 할 때 주로 사용한다.
    • ~에 해당하는 부분 패턴이 매치되지 않아야 한다.
  • ‘.*[.](?!bat$).*$’: 확장자가 bat이 아닌 경우에만 매치된다.

re


  • Python에서 정규식에 대한 기능을 지원하는 라이브러리이다.

pattern object


  • re.compile(패턴, option)
    • 정규식 패턴을 적용한 pattern 객체를 반환하는 함수이다.
    • 패턴을 컴파일 할 때, 여러가지 option을 지정할 수 있다.
      • re.DOTALL (re.S): dot이 \n을 포함하여 모든 문자와 매치하도록 한다.
        여러 줄 문자열에서 \n에 상관없이 검색할 때 유용하다.
      • re.IGNORECASE (re.I): 대소문자 관계없이 매치하도록 한다.
      • re.MULTILINE (re.M): 여러 줄 문자열에서 각 라인에 대해 매치하도록 한다.
        ^, $과 관련하여 쓰이곤 한다.
      • re.VERBOSE (re.X): 패턴을 여러 줄 문자열로 작성할 수 있다.
        내부에 주석도 사용할 수 있으며, white space는 자동으로 제거된다.
  • 하단에서 소개하는 패턴 객체의 다양한 메서드를 활용하여,
    대상 문자열에 패턴을 적용하여 매칭된 문자(열) match 객체를 반환하곤 한다.

match

  • 패턴 객체.match(대상 문자열)
    • 패턴과 매치되는지를 대상 문자열의 첫 부분부터 검색하여 판단한다.
    • 있으면 맨 처음 매치된 match 객체 하나를, 없으면 None을 반환한다.
  • re.match(패턴, 문자열)와 같이 패턴 객체 없이 한 번에 줄여 쓸 수도 있으나,
    한 번 만든 패턴 객체를 여러 번 사용해야 할 때는 따로 사용하곤 한다.

  • 패턴 객체.search(대상 문자열)
    • match 메서드와는 달리, 대상 문자열 전체를 검색하여 매치 여부를 파악한다.
    • 마찬가지로 match 객체 또는 None을 반환한다.

findall

  • 패턴 객체.findall(대상 문자열)
    • 대상 문자열 전체를 검색하여 패턴에 매치되는 모든 문자(열)을 찾는다.
    • 매치되는 부분 각각을 문자열로 나타내고, list의 각 요소로 반환한다.

finditer

  • 패턴 객체.finditer(대상 문자열)
    • findall과 같이 모두 찾는다.
    • iterator 객체로 반환하며, iterator는 각각 match 객체이다.

sub

  • 패턴 객체.sub(바꿀 문자열, 대상 문자열, n)
    • 대상 문자열에서 패턴에 매치되는 문자열을 다른 문자열로 바꿀 때 사용한다.
    • 대상 문자열의 바뀐 결과를 반환한다.
    • 3번째 기본 매개변수 count로, 바꿀 횟수를 제한할 수 있다. 기본값은 전체 적용이다.
    • 패턴에서 그룹핑을 사용했다면,
      바꿀 문자열에서 \g<그룹 이름 혹은 인덱스>로 참조할 수 있다.
    • 1번째 매개변수에는, 바꿀 문자열 대신 함수 객체를 넣을 수도 있다.
      • 해당 함수를 정의할 때, 매개변수로는 match 객체가 자동으로 전달되며
        문자열을 return 해야 한다.
  • 숫자, 알파벳 소문자, 밑줄, 마침표, 마이너스를 제외한 모든 문자를 제거하는 예시
     p = re.compile('[^0-9a-z_.-]')
     p.sub('', 대상 문자열) 
  • re.sub(pattern, 바꿀 문자열, 대상 문자열) 로 축약하여 사용할 수도 있다.

match object method


group

  • match 객체.group(그룹 명 혹은 인덱스)
  • 매치된 문자열을 반환한다.
  • 패턴에 그룹핑을 사용했을 때 유용하다.
    • 인자는 그룹의 인덱스로, 기본 값인 0은 매치된 문자열 전체를 반환한다.
      인덱스 n부터는, 차례대로 n번째 그룹에 대응되어 하나만 반환한다.
    • 그룹에 이름을 지정했다면, 인자로 숫자 대신 그룹명을 넣어서 해당 그룹을 반환한다.
    • 단, findall()과 같이, match 객체를 return 하지 않는 경우에는
      group()을 사용할 수 없으나, 그룹핑된 부분만 추출한다.

start

  • match 객체.start()
  • 매치된 문자열의 시작 인덱스를 반환한다.

end

  • match 객체.end()
  • 매치된 문자열의 끝 인덱스(+1)를 반환한다.

span

  • match 객체.span()
  • 매치된 문자열의 시작과 끝 인덱스를 튜플로 반환한다.

0개의 댓글