자료구조+알고리즘

정규 표현식, re 모듈

덕구공 2021. 6. 19. 03:36

메타문자

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

문자 클래스 [ ]

  • 문자 클래스를 만드는 메타 문자인 [ ] 사이에는 어떤 문자도 들어갈 수 있다.
  • [ ] 사이의 문자들 중 한 글자를 의미한다.
    • 예를들어 [abcd]라면 a, b, c, d 중 한개라는 의미이다.
  • [ ] 안의 -는 범위를 의미한다. 
    • [0-9]라면 0~9 사이 숫자중 하나라는 의미이다.
  • [ ] 안의 맨 앞의 ^는  NOT을 의미한다. 
    • [^0-9]라면 0~9를 제외한 문자 하나를 의미한다. 
    • 주의사항 ! [ ] 사이에서 ^를 쓰고 싶으면 맨 앞에 쓰면 안됨! NOT을 의미하기 때문

Dot(.)

  • .은 줄 바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
  • d.b라는 정규식이 있다고 하면 이 정규식의 의미는 "d + 모든 문자 + b"를 의미한다!
  • d[ . ]b 라는 정규식은 "d + . + b"를 의미한다!
    • 메타 문자를 그대로 사용하고 싶을 때는 [ ] 안에 넣어서 사용하면 된다!

반복(*)

  • * 바로 앞에 있는 문자가 0부터 무한까지 반복될 수 있다는 의미이다!!
  • [0-9a-z]* 라는 정규식이 있다면 이 정규식의 의미는 "모든 숫자와 소문자가 0부터 무한까지 반복될 수 있다는 의미이다"
    • "1234abcd"와 같은 문자열이 매치된다!
    • " "와 같은 공백 문자열되 매치된다!

반복(+)

  • + 바로 앞에 있는 문자가 최소 1번이상 반복될 때 사용한다!
  • [^0-9]+라는 정규식이 있다면 이 정규식의 의미는 "0-9가 아닌 문자가 적어도 1개 이상 반복됨"을 의미한다!

문자열 시작(^)

  • 문자열 시작을 의미한다.
    • [^ ]와 혼동하지 말자!
  • ^123 이라면 "123"으로 시작하는 문자열을 의미한다.
    • "1235657"과는 매치하지만 "124"와는 매치하지 않는다!

문자열 마지막($)

  • 문자열의 마지막을 의미한다!
  • $duck 이라면 "duck"으로 끝나는 문자열을 의미한다

re 모듈

  • 코드 최상단에 re 모듈을 import해서 사용한다.
import re

re.match('패턴', '문자열')

  • 문자열의 처음부터 시작하여 패턴과 일치하는 것이 있는 것을 확인하는 메서드
    • 아래 코드에서 세번째 결과는 처음부터 검색을 시작할 때 'c' 가 없어서 None이 나온다.
  • 함수의 첫번째 인자로 패턴, 두번째 인자로 문자열이 들어간다.
    • 세번째 인자로 flag가 있는데 신경 안써도 됩니당ㅋ
import re

print(re.match('[abc]', 'abfc'))
#<re.Match object; span=(0, 1), match='a'>
print(re.match('[abc]+', 'abfc'))
#<re.Match object; span=(0, 2), match='ab'>
print(re.match('c', 'abfc'))
#None

re.search('패턴', '문자열')

  • re.match와 다르게 반드시 문자열의 처음부터 일치할 필요가 없다!
  • 문자열의 처음 뿐만 아니라 중간부터라도 패턴과 일치되는 부분을 찾는 메서드
import re

print(re.search('[abc]', 'abfc'))
#<re.Match object; span=(0, 1), match='a'>
print(re.search('[abc]+', 'dbfc'))
#<re.Match object; span=(1, 2), match='b'>
print(re.search('c', 'abfc'))
#<re.Match object; span=(3, 4), match='c'>

re.findall('패턴', '문자열')

  • 문자열에서 패턴과 일치되는 모든 부분을 "겹치지 않게" 리스트로 반환해줌!
    • 3번째 예시와 4번째 예시를 잘 비교해보자!!
import re

print(re.findall('[abc]', 'abfcadf'))
# ['a', 'b', 'c', 'a']
print(re.findall('[abc]+', 'abfcadf'))
# ['ab', 'ca']
print(re.findall('c', 'abcfc'))
# ['c', 'c']
print(re.findall('ddd', 'dddd'))
# ['ddd']

re.sub('패턴', '대체할 문자열', '문자열')

  • 패턴과 일치하는 문자열을 대체할 문자열로 바꿔서 리턴해주는 메서드
import re

print(re.sub('[abc]', 'd', 'abfcadf'))
# ddfdddf
print(re.sub('[abc]+', 'd', 'abfcadf'))
# dfddf
print(re.sub('c', 'd', 'abcfc'))
# abdfd

예제) 소문자, 숫자, -, _, . 을 제외한 문자를 모두 지우시오

print(re.sub('[^0-9a-z-_.]', '', '...!@BaT#*..y.abcdefghijklm'))
# ...a..y.abcdefghijklm