[Python] 정규 표현식

2021. 1. 4. 17:26Programming Language/Python

정규표현식

문자열에 특정한 규칙이 있는 경우,

해당 규칙을 식으로 정의하여 규칙에 맞는 문자열들을 추출할 때 사용하는 기능

 

정규표현식 확인 사이트

https://regexr.com/: 정규표현식을 만들 때 입력하면 텍스트에서 패턴이 일치하는 부분을 하이라이트 표시해준다.

 

메타 문자(Meta Characters)

정규표현식에서 사용하는 메타문자는 다음과 같다.

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

 

문자 클래스 []

문자 클래스로 만들어진 정규식은 "[ ] 사이의 문자들과 매치" 라는 의미를 갖는다.

문자 클래스를 만드는 문자인 [] 사이에는 어떤 문자도 들어갈 수 있다.
즉 정규표현식이 [abc]라면 이 표현식의 의미는 "a,b,c 중 한 개의 문자와 매치"를 뜻한다.

매치 란 무엇을 의미할까? [abc]에 대해 "a", "before", "dude"를 살펴보면,

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

[]안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위를 나타낸다. 예를들어, [0-9]0123456789를 의미한다(숫자).

  • [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: 문자+숫자와 매치, [a-zA-Z0-9_]와 동일

  • \W: 문자+숫자 가 아닌 것과 매치. [^a-zA-Z0-9_]와 동일한 표현식

    대문자는 소문자의 반대를 뜻한다.

 

Dot(.)

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

a.b

위 정규식은 "a + 모든 문자 +b"를 의미한다.

a.bab와 매치되지 않는다. a와 b 사이에 어떤 문자라도 하나는 있어야 한다.

 

반복(*)

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

 

반복(+)

*와 달리 최소 1번은 반복되어야 한다.

 

반복({m,n}, ?)

{}메타문자를 사용하면 반복 횟수를 고정 할 수 있다.

{1,}+와, {0,}*와 동일

?은 있어도 되고 없어도 된다는 의미이다.

 

 

파이썬의 re모듈

파이썬은 정규 표현식을 지원하기 위해 re(regular expression)모듈을 제공한다.

import re
p = re.compile('ab*') # 예시이다.

이렇게 정규 표현식을 컴파일 한다. re.compile의 결과로 돌려주는 객체p(컴파일 된 패턴 객체)를 사용하여 그 이후의 작업을 수행 할 것이다.

  • 패턴이란 정규식을 컴파일 한 결과이다.

 

파이썬의 메소드

  • match(): 문자열의 처음부터 정규식과 매치되는 지 조사.

  • search(): 문자열 전체를 검색하여 정규식과 매치되는지 조사.

  • findall(): 정규식과 매치되는 모든 문자열을 리스트로 리턴

  • finditer(): 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 리턴.

    match, search는 매치되지 않을 때 None을 리턴한다.

import re
p = re.compile('[a-d]')

str = "Hello World"
m = p.match(str)
print(m)

결과

None

import re
p = re.compile('[a-z]+')

str = "python"
m = p.match(str)
print(m)

결과

<re.Match object; span=(0, 6), match='python'>

import re
p = re.compile('[a-d]')

str = "Hi, my name is Yuseon"
m = p.search(str)
print(m)

결과
<re.Match object; span=(8, 9), match='a'>

 

match()search()는 문자열의 처음부터인지 아닌지 구분하여 사용

 

 

문제풀이에 사용 될 것 같은 내용을 정리했고,
https://wikidocs.net/4308 의 내용을 참고했으니 더 알고싶다면 이 링크에서 보면 되겠다.

반응형