정규 표현식 - 1

LONGNEW·2021년 1월 14일
0

여러가지

목록 보기
12/18

복잡한 문자열을 처리할 때 사용하는 기법.

파이썬만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용된다.

왜 필요한가?

예를 들어, 주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를 * 문자로 변경해 보자.

이 때에 정규 표현식을 이용하지 않은 경우.

  1. 전체 텍스트를 공백 문자로 나눈다(split).
  2. 나뉜 단어가 주민등록번호 형식인지 조사한다.(리스트 슬라이싱 해서 옳은 형식인지 확인)
  3. 단어가 주민등록번호 형식이라면 뒷자리를 *로 변환한다. (리스트에 * 들 추가해주기)
  4. 나뉜 단어를 다시 조립한다.

그러나, 정규 표현식을 이용하면 한 줄로 만들 수 있다.

import re 

data = """
park 800905-1049118
kim  700905-1059119
"""

pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))

메타 문자.

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

아래와 같은 문자들이 메타 문자이다.

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

문자 클래스 []

문자 클래스로 만들어진 정규식은 "[] 사이의 문자들과 매치"라는 의미를 갖는다.
즉, 정규 표현식이 [abc]라면 "a, b, c 중 한 개의 문자와 매치"를 뜻한다.

문자열 "a", "before", "dude"가 정규식 [abc]와 어떻게 매치되는지 살펴보자.

  • "a"는 정규식과 일치하는 문자인 "a"가 있으므로 매치
  • "before"는 정규식과 일치하는 문자인 "b"가 있으므로 매치
  • "dude"는 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으므로 매치되지 않음

두 문자 사이에 하이픈(-)을 사용

두 문자 사이의 범위를 의미한다.
[a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5][012345]와 동일

  • [a-zA-Z] : 알파벳 모두
  • [0-9] : 숫자

문자 클래스 안에 ^ 메타 문자를 사용할 경우에는 반대(not)라는 의미를 갖는다.
[^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치된다.

[자주 사용하는 문자 클래스]

[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.
\d - 숫자와 매치, [0-9]와 동일한 표현식이다.
\D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
\s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
\S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
\w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9_]와 동일한 표현식이다.
\W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9_]와 동일한 표현식이다.
대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다.

Dot(.)

Dot(.) 메타 문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.

a.b

"a + 모든문자 + b"

a[.]b

"a + Dot(.)문자 + b"
찐 Dot(.)을 찾는 것.

반복 (*)

** 바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미

ca*t

반복 (+)

+는 최소 1번 이상 반복될 때 사용한다.(바로 앞의 문자가 최소 1번)

ca+t

반복({m, n}, ?)

반복 횟수를 3회만 또는 1회부터 3회까지만으로 제한하고 싶으면?
{m(부터), n(까지)}
또한 m 또는 n을 생략할 수도 있다. 만약 {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3 이하를 의미한다.

  1. {m}
ca{2}t

"c + a(반드시 2번 반복) + t"


2. {m, n}

ca{2, 5}t


3. ?
? 메타문자가 의미하는 것은 {0, 1} 이다.

ab?c

"a + b(있어도 되고 없어도 된다) + c"

출처 : https://wikidocs.net/1642

0개의 댓글