ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 정규식 표현 re
    언어/파이썬 2020. 12. 20. 00:00

    leetCode 문제를 풀어보기 시작했다. 처음 시작한 문제에서 입력으로 받은 데이터는 대소문자를 구분하지는 않지만 숫자와 영어만으로 이루어져있어야 한다는 제약조건이 있었다.

    이때 활용할 수 있는 것을 찾다가 정규표현식 re를 알게되었다.

    메타문자

    특수한 기능을 하는 문자로 import 등 파이썬의 예약어와 비슷한 역할을 맡는 문자열이라고 생가하면 된다.

    파이썬 re 모듈의 메타문자는 총 12개로 다음과 같다

    $ () * + . ? [ \ ^ { \ } ]

    메타문자는 각각의 문자 하나에 매칭되지 않는다.

    예를들어 일반 문자인 a 는 문자 'a'와 매칭되지만, 소괄호 (는 (와 매칭되지 않는다.

    그럼 ( 를 어떻게 판별 할 수 있을까?

    메타문장 앞에 백슬래시 \ 를 붙여주면 일반문자처럼 한문자에 매칭된다.

    일대일 매칭되는 문자

    정규표현식에서 메타문자를 제외한 모든 문자 하나는 일반 문자열 하나와 매칭된다. 즉 aa 와만 매칭되지 갑자기 와 매칭되는일은 없다.

    re 패키지 기본 method

    import

    import re 를 해야 사용할 수 있다.

    re.match(pattern, string, flags)

    re.match 함수는 patternstring의 첫부분과 일치하는지 확인한다. 만약 일치하면 match Object를 반환하고 그렇지 않으면 None을 반환한다.

    re.search(pattern, string, flags)

    re.search 함수는 "문자열의 처음" 부터 시작할 필요 없이 일치하기만 하면 된다. 문자열의 처음 뿐 아니라 중간부터라도 패턴과 일치되는 부분이 있는지를 찾으면 된다.

    re.sub(str1,str2)

    정규식 패턴표현

    패턴 설명 예제
    ^ 이 패턴으로 시작해야 함 ^abc : abc로 시작해야 함 (abcd, abc12 등)
    $ 이 패턴으로 종료되어야 함 xyz$ : xyz로 종료되어야 함 (123xyz, strxyz 등)
    [문자들] 문자들 중에 하나이어야 함. 가능한 문자들의 집합을 정의함. [Pp]ython : "Python" 혹은 "python"
    [^문자들] [문자들]의 반대로 피해야할 문자들의 집합을 정의함. [^aeiou] : 소문자 모음이 아닌 문자들
    | 두 패턴 중 하나이어야 함 (OR 기능) a | b : a 또는 b 이어야 함
    ? 앞 패턴이 없거나 하나이어야 함 (Optional 패턴을 정의할 때 사용) \d? : 숫자가 하나 있거나 없어야 함
    + 앞 패턴이 하나 이상이어야 함 \d+ : 숫자가 하나 이상이어야 함
    * 앞 패턴이 0개 이상이어야 함 \d* : 숫자가 없거나 하나 이상이어야 함
    패턴{n} 앞 패턴이 n번 반복해서 나타나는 경우 \d{3} : 숫자가 3개 있어야 함
    패턴{n, m} 앞 패턴이 최소 n번, 최대 m 번 반복해서 나타나는 경우 (n 또는 m 은 생략 가능) \d{3,5} : 숫자가 3개, 4개 혹은 5개 있어야 함
    \d 숫자 0 ~ 9 \d\d\d : 0 ~ 9 범위의 숫자가 3개를 의미 (123, 000 등)
    \w 문자를 의미 \w\w\w : 문자가 3개를 의미 (xyz, ABC 등)
    \s 화이트 스페이스를 의미하는데, [\t\n\r\f] 와 동일 \s\s : 화이트 스페이스 문자 2개 의미 (\r\n, \t\t 등)
    . 뉴라인(\n) 을 제외한 모든 문자를 의미 .{3} : 문자 3개 (F15, 0x0 등)

    [] 안의 두 문자에 -를 사용하면 두 문자 사이의 범위를 뜻한다.

    [] 안에서 ^반대를 뜻한다.

    [^0-9] # 숫자를 제외한 문자만 매치
    [^abc] # a, b, c를 제외한 모든 문자와 매치

    re.sub(pattern,  repl,   string,   count,   flags)

    re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수)

     

    re.sub은 패턴에 일치되는 문자열은 다른 문자열로 바꿔주는 것이므로, repl은 당연히 그 ‘다른 문자열’에 해당하는 부분이다.

    count 인자는, 최대 몆 개까지 치환할 것인가를 지정한다. 만약 일치되는 문자열이 3인데 count=2로 지정되어 있으면 마지막 세 번째 문자열은 치환되지 않는다.
    물론 일치되는 문자열이 count보다 적으면 그냥 전부 다 치환된다.

    re.sub("[^a-z0-9]", "", s) # s에 있는 문자중 앞에 패턴과 일치하는 것이면 "" 즉 삭제한다.

    또한 정규식 쓰는 형식을 보면 위처럼 정규식 안에 패턴에 r이 들어가 있는것을 볼 수 있는데 이는 있는 그대로 표현하기 위하여 raw의 약어인 r을 붙여준것이다. 만약 r을 붙여주지 않으면 \을 \\로 써줘야 하는 번거러움이 있다. 

    '언어 > 파이썬' 카테고리의 다른 글

    전역변수 global  (0) 2020.12.29
    파이썬에 관한 흥미로운 사실  (0) 2020.12.29
    defaultdict()  (0) 2020.12.28
    pdb  (0) 2020.12.22
    참조와 사본의 차이 (S와 S[:] 의 차이)  (0) 2020.12.22

    댓글