Regular Expressions (Regex)
Original Source: https://www.coursera.org/specializations/data-science-python
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