Regular Expressions (Regex)

1. Meta Characters

  • . : 아무 문자 하나
  • ^ : 문자열의 시작
  • $ : 문자열의 끝
  • [] : [] 안에 있는 아무 문자 하나
  • [a-z] : a~z 중 아무 문자 하나
  • [^abc] : a.b.c가 아닌 아무 문자 하나
  • a|b : a 또는 b
  • () : scoping for operators (이후에 예시를 통해 알아봄)
  • (?:a|b)b 와 같이 ‘a 또는 b’를 묶어서 나타내야 할 때에는 여는 괄호 뒤에 ?:를 넣는다.

  • \ : escape character (ex. \t, \n (각각 탭, 엔터))
  • \b : 단어의 경계
  • \d : 아무 숫자 하나
  • \D : 숫자가 아닌 문자 하나
  • \s : 아무 빈 공간 하나
  • \S : 빈 공간이 아닌 문자 하나
  • \w : 알파벳 또는 숫자 하나
  • \W : 알파벳과 숫자가 아닌 문자 하나

  • * : 아예 안 나오거나 연속으로 한 번 이상 나오는 경우
  • + : 연속으로 한 번 이상 나오는 경우
  • ? : 연속으로 한 번 나오거나 안 나오는 경우
  • {n} : 연속으로 n 번 나오는 경우
  • {n,} : 연속으로 적어도 n 번 나오는 경우
  • {,n} : 연속으로 최대 n 번 나오는 경우
  • {m,n} : 연속으로 적어도 m 번, 많아도 n 번 나오는 경우

2. 파이썬 기본 라이브러리를 활용한 실습

import re
  • @뒤에 문자 또는 숫자가 나오는 단어를 찾아보자.
text = 'Hello. I am string. @UN'
text_list = text.split(' ')
[w for w in text_list if re.search('@\w+', w)]
['@UN']
re.findall(r'@\w+', text)
['@UN']
  • 날짜를 모두 찾아보자
date = '23-10-2002\n23/10/2002\n23/10/02\n10/23/2002\n23 Oct 2002\n23 October 2002\nOct 23, 2002\nOctober 23, 2002'
print(date)
23-10-2002
23/10/2002
23/10/02
10/23/2002
23 Oct 2002
23 October 2002
Oct 23, 2002
October 23, 2002

먼저 일 월 년 순서로 되어 있는 날짜부터 찾겠다.

re.findall(r'(?:[1-9]|1[0-9]|2[0-9]|3[0-1])-(?:1[0-2]|[1-9])-(?:\d{4}|\d{2})', date)
['23-10-2002']
re.findall(r'(?:[1-9]|1[0-9]|2[0-9]|3[0-1])[-/ ,]+(?:1[0-2]|[1-9])[-/ ,]+(?:\d{4}|\d{2})', date)
['23-10-2002', '23/10/2002', '23/10/02']
re.findall(r'(?:[1-9]|1[0-9]|2[0-9]|3[0-1])[-/ ,]+(?:1[0-2]|[1-9]|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[-/ ,]+(?:\d{4}|\d{2})', date)
['23-10-2002', '23/10/2002', '23/10/02', '23 Oct 2002']
re.findall(r'(?:[1-9]|1[0-9]|2[0-9]|3[0-1])[-/ ,]+(?:1[0-2]|[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)[-/ ,]+(?:\d{4}|\d{2})', date)
['23-10-2002', '23/10/2002', '23/10/02', '23 Oct 2002', '23 October 2002']

다음으로 월 일 년 순서로 되어 있는 날짜를 찾겠다.

re.findall(r'(?:1[0-2]|[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)[-/ ,]+(?:[1-9]|1[0-9]|2[0-9]|3[0-1])[-/ ,]+(?:\d{4}|\d{2})', date)
['3-10-2002',
 '3/10/2002',
 '3/10/02',
 '10/23/2002',
 'Oct 23, 2002',
 'October 23, 2002']
re.findall(r'\b(?:1[0-2]|[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)[-/ ,]+(?:[1-9]|1[0-9]|2[0-9]|3[0-1])[-/ ,]+(?:\d{4}|\d{2})', date)
['10/23/2002', 'Oct 23, 2002', 'October 23, 2002']

Leave a Comment