[Python] 정규(표현)식

김영환·2021년 2월 22일
0

Python

목록 보기
10/11
post-thumbnail

0.Regular expression

정규 표현식(Regular Expressions)은 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다. 정규 표현식을 배우는 것은 파이썬을 배우는 것과는 또 다른 영역의 과제이다.
※ 정규 표현식은 줄여서 간단히 "정규식"이라고도 말한다.

1. 메타 문자

✏️ 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자를 말한다.
. ^ $ * + ? { } [ ] \ | ( )

문자 클래스 [ ]

✏️ 문자 클래스를 만드는 메타 문자 [] 사이에는 어떤 문자도 들어갈수 있다.
문자 집합인 문자 클래스를 지정하는 데 사용됩니다. 문자는 개별적으로 나열되거나 두 문자를 두고 - 로 구분하여 문자의 범위를 표현한다.
ex) [abc] = [a-c]
❗️ 메타 문자는 클래스 내부에서는 활성화 되지 않습니다
[akm$]'a' 'k' 'm' '$' 문자와 일치하게 기능하며, '$' 대게 매타문자이지만 문자 클라스 안에서는 특수한 특성이 없어진다.

^

^ 메타 문자는 문자열의 맨 처음과 일치함을 의미한다.
ex) '^Life' 는 비교하는 정규식은 Life 문자열이 처음에 왔는지 매치 여부를 알려준다.

>> print(re.search('^Life', 'Life is too short'))
<re.Match object; span=(0, 4), match='Life'>
>> print(re.search('^Life', 'My Life'))
None

❗️ 문자 클래스([]) 안에서 사용되는 ^은 반대not)라는 의미를 갖는다
ex) `[^5] : '5'를 제외한 모든 문자 `

$

$ 메타 문자는 ^ 메타 문자와 반대의 경우이다. 즉 $는 문자열의 끝과 매치함을 의미한다.

|

| 메타문자는 or과 동일한 의미로 사용된다. A|B 라는 정규식이 있다면, A 또는 B라는 의미가 된다.

. (마침표)

줄바꿈 문자 \n을 제외한 모든 문자를 매치를 의미
❗️a[.]b = 'a + Dot(.) + b'

백 슬래시(\)

'\' 로 시작하는 특수 시퀀스 중 일부는 숫자(digit) 집합, 글자(letter) 집합 또는 종종 유용한 미리 정의된 문자 집합을 나타내기도 한다.

  • \d : 모든 십진 숫자와 일치 합니다. = [0-9]
  • \D : 모든 비 숫자 문자와 일치합니다. = [^0-9]
  • \s : 모든 공백 문자와 일치합니다. = [ \t\n\r\f\v]
  • \S : 모든 비 공백 문자와 일치합니다 = [^ \t\n\r\f\v]
  • \w : 모든 영숫자와 일치합니다 = [a-zA-Z0-9_]
  • \W : 모은 비영숫자와 일치합니다 = [^a-zA-Z0-9_]

메타 캐릭터가 캐릭터 자체를 표현하도록 할 경우
\[ \] \\ \.

반복패턴

  • 반복(+)

    + : 1번 이상의 패턴이 발생

  • 반복(*)

    * : 0번 이상의 패턴의 발생

  • 반복(?)

    ? : 0 혹은 1번의 패턴이 발생 (있거나 없거나)

  • 반복({m,n}, ?)

    {m} : 반드시 m 번 반복
    {m,n}: m~n 번 반복
    ✏️ {1,} = +
    ✏️ {0,} = *

2. re 모듈

match

search와 유사하나, 주어진 문자열의 시작부터 비교하여 패턴이 있는지 확인
시작부터 해당 패턴이 존재하지 않는다면 None으로 반환한다

findall

search가 최초로 매칭되는 패터만 반환한다면, findall은 매칭되는 전체 패턴을 리스트 형태로 반환

sub

주어진 문자열에서 일치하는 모든 패턴을 replace 그 결과를 문자열로 다시 반환함
두번째 인자는 특정 문자열이 될 수도 있고, 함수가 될 수도 있다.

compile

동일한 정규표현식을 매번 다시 쓰기 번거로움을 해결 compile로 해당표현식을 re.RegexObject 객체로 저장하여 사용가능

3. Grouping : ( )

ABC 문자열이 계속해서 반복되는지 조사하는 정규식을 작성하고 싶다고 하자. 이럴 때 필요한 것이 바로 Grouping 이다.

ex) (ABC)+

그룹을 만들어 주는 메타 문자는 바로 ( ) 이다.

아래 예제를 한번보면 grouping에 대한 이해가 좀 더 수월할것이다.

>> import re

>> p =re.compile(r'(\w+)\s+(\d+[-]\d+[-]\d+)')
>> m = p.search('kim 010-1234-1234')
>> print(m.group(0))
kim 010-1234-1234

>> print(m.group(1))
kim

>> print(m.group(2))
010-1234-1234

>> print(m.group(3))
Traceback (most recent call last):
 File "<stdin>", line 1, in <module
IndexError: no such group

만약에, 위에서 group(3)을 추가하고 싶다면

p =re.compile(r'(\w+)\s+((\d+)[-]\d+[-]\d+)')
추가적으로 하나의 ( ) 그룹을 추가해주면 된다.

>> p =re.compile(r'(\w+)\s+((\d+)[-]\d+[-]\d+)')
>> m = p.search('kim 010-1234-1234')
>> print(m.group(3))
010

0개의 댓글