-
파이썬 정규식 표현 re언어/파이썬 2020. 12. 20. 00:00
leetCode 문제를 풀어보기 시작했다. 처음 시작한 문제에서 입력으로 받은 데이터는 대소문자를 구분하지는 않지만 숫자와 영어만으로 이루어져있어야 한다는 제약조건이 있었다.
이때 활용할 수 있는 것을 찾다가 정규표현식 re를 알게되었다.
메타문자
특수한 기능을 하는 문자로
import
등 파이썬의 예약어와 비슷한 역할을 맡는 문자열이라고 생가하면 된다.파이썬
re
모듈의 메타문자는 총 12개로 다음과 같다$ () * + . ? [ \ ^ { \ } ]
메타문자는 각각의 문자 하나에 매칭되지 않는다.
예를들어 일반 문자인
a
는 문자 'a'와 매칭되지만, 소괄호 (는 (와 매칭되지 않는다.그럼 ( 를 어떻게 판별 할 수 있을까?
메타문장 앞에 백슬래시 \ 를 붙여주면 일반문자처럼 한문자에 매칭된다.
일대일 매칭되는 문자
정규표현식에서 메타문자를 제외한 모든 문자 하나는 일반 문자열 하나와 매칭된다. 즉
a
는a
와만 매칭되지 갑자기가
와 매칭되는일은 없다.re 패키지 기본 method
import
import re
를 해야 사용할 수 있다.re.match(pattern, string, flags)
re.match
함수는pattern
이string
의 첫부분과 일치하는지 확인한다. 만약 일치하면 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