<Notes>
- 자연어 처리 수업 필기 + 보충학습
- 정규식 연습은 지루하지만 연습을 해놓으면 평생 도움이 된다
정규식은 연속적인 문자들을 검색하는 제어방법이다. 뭐 문자열의 패턴을 표현하는 문자열이라고 이해해도 좋다. 특정한 문자열이나 문자 패턴을 찾는 데 사용되며, 매우 강력하고 유용한 도구이기 때문에 반드시 알아야 한다.
시작은 늘 쉽게, 진짜 기초 메타 문자만 조금 볼까?
.
: 어떤 문자 하나를 나타낸다.
*
: 바로 앞의 문자나 표현식이 0번 이상 반복되는 것을 나타낸다. 0번이면 없어도 된다는 뜻!
+
: 바로 앞의 문자나 표현식이 1번 이상 반복되는 것을 나타낸다.
?
: 바로 앞의 문자나 표현식이 0번 또는 1번 등장하는 것을 나타낸다.
[]
: 괄호 안에 있는 문자 중 하나를 나타낸다.
^
: 문자열의 시작을 나타낸다.
$
: 문자열의 끝을 나타낸다.
{n}
: 정확히 n 번만큼 일치시킨다.
{n, }
: n번 이상만큼 일치시킨다.
{n, m}
: n번 이상 m번 이하 일치시킨다.
조금 더 자세하게 들어가보자! 특수 시퀀스까지!
\A
: 지정된 문자가 문자열의 시작 부분에 있으면 일치 항목을 반환한다.
\w
: 알파벳 문자나 숫자와 매치된다.
\W
: 알파벳 문자나 숫자가 아닌 문자와 매치된다. 소문자를 바탕으로 아닌 것들을 매치하는듯
\d
: 숫자와 매치된다. [0-9]와 같다.
\D
: 숫자가 아닌 문자와 매치된다.
\s
: 공백(스페이스, 탭, 개행 문자 등)과 매치된다.
\S
: 공백이 아닌 문자와 매치된다.
\b
: 단어 경계, 단어의 시작 또는 끝에 뒤에 나올 문자가 있어야 한다.
\B
: 단어의 경계가 아닌 위치에 뒤에 나올 문자가 있어야 한다. 예제 참고
이번에는 바로 실습을 들어가는 것이 훨씬 도움이 될 것으로 생각된다. 예제 문제들을 하나씩 보면서 감을 익혀보자
문제를 풀기 위한 기본 코드는 다음과 같다.
# Solution
def text_match(text):
patterns = '여기에 들어갈 패턴을 작성하자'
if re.search(patterns, text):
return 'Found a match!'
else:
return('Not matched!')
print(text_match("확인할 텍스트 입력해보자"))
그럼 바로 문제 시작! 메타 문자 확인부터
📖 영문자 a를 포함하며 a 뒤에 0개 이상의 b가 있는지 검사하라.
patterns = 'ab*'
📖 영문자 a를 포함하며 a 뒤에 하나 이상의 b가 있는지 검사하라.
patterns = 'ab+'
📖 영문자 a를 포함하며 a 뒤에 b가 0개 또는 1개 이어지는지 검사하라.
patterns = 'ab?'
📖 영문자 a 뒤에 3개의 b가 이어지는지 검사하라.
patterns = 'ab{3}'
📖 영문자 a 뒤에 2~3개의 b가 이어지는지 검사하라.
patterns = 'ab{2,3}'
📖 영문 소문자 문자열들이 언더바(_)로 이어져 있는지 검사하라.
patterns = '^[a-z]+_[a-z]+$' # (대신 $ 땜시 맨 뒤도 소문자 문자열로 끝나야 한다.)
📖 대문자 하나에 소문자가 따라붙는 경우가 있는지 검사하라.
patterns = '[A-Z][a-z]+'
📖 문자열에 a가 있고, a 뒤에 문자들이 이어지다가, b로 끝나는지 검사하라.
patterns = 'a.+b$'
특수 시퀀스도 이제는 볼 수 있어야 한다.
📖 문자열 시작이 단어인지 검사하라.
patterns = '^[a-zA-Z]+' or '^\w+'
📖 문자열dl 단어로 끝나는지 검사하라.
patterns = '.*[a-zA-Z]+\S*$' or '\w+\S*$' # 문장의 끝에 온점이 있을 수 있기 때문에 \S 사용
📖 z가 포함된 단어를 포함하는지 검사하라.
patterns = '\w*z\w*'
📖 z가 포함된 단어가 포함되어 있지만, 문자열의 끝 또는 마지막이 아닌 중간에 위치하는지 검사하라.
patterns = '\Bz\B'
📖 영문 대소문자, 숫자, 언더바만 포함하는지 검사하라.
patterns = '^\w+$'
📖 숫자 5로 시작하는지 검사하라.
patterns = '^5'
📖 문자열 끝이 숫자인지 검사하라.
patterns = '.*\d+$' or '.*[0-9]+$'
re 함수도 조금 공부해보자
📖 문자열에 포함된 1자리~3자리 숫자를 찾아라.
patterns = re.finditer(r"(\d{1,3})", "hi 12 hello 123")
📖 문자열에서 특정 문자열을 검색하고, 해당 문자열의 위치를 확인하기
pattern = 'fox' text = 'The quick brown fox jumps over the lazy dog.' match = re.search(pattern, text) s = match.start() e = match.end() print('"%s" 는 "%s"의 %d 에서 %d 에 있음' % (match.re.pattern, match.string, s, e))
📖 IP주소에서 선행 0(불필요한 0)을 제거하라.
ip = 216.08.007 patterns = re.sub('\.[0]*', '.', ip)
📖 문자열에서 특정 검색어 모두 찾기
text = 'Python exercises, PHP exercises, C# exercises' pattern = 'exercises' for match in re.findall(pattern, text): print('Found "%s"' % match)
<에필로그>
당분간은 안까먹을듯 ㅋㅋㅋㅋㅋ
나중에 latex 문법도 공부하자 앗 그리고
https://www.w3schools.com/python/python_regex.asp
- W3C Schools 튜토리얼을 통해 실습이 가능하다!