출처 : https://dojang.io/mod/page/view.php?id=2438

정규표현식이란?

정규표현식의 사전적인 의미로는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다. 즉 텍스트 데이터의 표현 방법을 다루는 것이라고 생각하면 된다. 하지만 코드가 간단한 만큼 가독성이 떨어져서 표현식을 제대로 숙지하지 않으면 이해하기 힘들다는 문제점이 있다.

하지만 텍스트 데이터를 처리하기 위한 가장 기초적인 문법이고, 데이터 익명화와 같은 여러 기술에서 많이 사용하게 된다. 자연어처리를 하기 위한 토대인 것이다.


문자열 검색

출처 : 위키독스

import re

re.match('연어','연어초밥')
>>> match='연어'
re.match('장어','연어초밥')
>>> 아무것도 x

re.search('연어','연어초밥')
>>> match='연어'
re.search('장어','장어초밥')
>>> 아무것도 x

re라는 패키지를 불러오고 match와 search method를 사용했을 때, 단어가 뒤에 단어에 포함되면 단어를 출력하는 것을 볼 수 있다. 이렇게 보면 둘이 다른 점이 무엇인지 의문을 가질 수 있다.

re.match("한다", "나는 생각한다 고로 존재한다.")
>>> None

re.search("한다", "나는 생각한다 고로 존재한다.")
>>> match ='한다'

 위 코드 예시를 보자면 match에서 한다를 검색했을 때는 None값이 나오고, search에서 검색했을 때는 올바르게 값이 나왔다. 이 이유는 match는 문장의 맨 앞에 일치하는 문자가 있는 경우에만 반환하고, search는 위치에 상관없이 반환해주기 때문이다.

re.search("한다", "나는 생각한다 고로 존재한다.")
>>> match='한다'

re.findall("한다", "나는 생각한다 고로 존재한다.")
>>> ['한다', '한다']

이 search의 문제점을 보완하기 위해 findall이라는 method가 존재하는데 findall은 포함하는 문자를 모두 찾아준다.


메타문자

메타 문자는 간단히 말하면 특수 문자 기호이다. 정규표현식 내에서 특별한 의미를 갖는 문자 기호이고, [].^/_?| 등 다양한 기호들을 통해 정규표현식의 활용법이 다양해진다.

[ ] 기호

이 기호는 [ ] 안에 있는 낱글자(한 글자)들이 텍스트에 포함되어 있는지 찾아준다.

한글 텍스트

re.findall("[연어]","연어초밥")
>>> ['연','어']

re.findall("[가-힣]","연어초밥")
>>> ['연','어','초','밥']

text = "텍스트마이닝은 정말 신기해요.ㅎ헤ㅏ핳"
re.findall('[ㄱ-ㅎㅏ-ㅣ가-힣]',text)
>>> ['텍','스','트','마','이','닝','은','정','말','신','기','해','요','ㅎ','헤','ㅏ','핳']

첫 번째 [연어]를 보자면 뒤에 연어초밥 문자 안에 '연','어'라는 낱글자들을 반환해주는 것을 볼 수 있다.

그리고 '-' 하이픈 기호를 추가해서 [가-힣]과 같이 표현한다면 '가'와 '힣'이라는 단어 사이에 있는 모든 글자들을 반환해주기 때문에 '연','어','초','밥'이라는 모든 글자가 출력된 것을 볼 수 있다.

또한 [가-힣]과 같이 한 구간이 아닌 여러 구간을 합칠 수가 있다. [ㄱ-ㅎ], [ㅏ-ㅣ], [가-힣]이라는 단어의 구간을 합쳐서 [ㄱ-ㅎㅏ-ㅣ가-힣]라고 표현할 수 있는데, 이는 세 구간을 합집합 한 것이라고 보면 된다.


영어 텍스트

text = 'I love You'

re.findall('[A-Z]', text)
>>> ['I','Y']

re.findall('[a-z]', text)
>>> ['l','o','v','e','o','u']

re.findall('[A-Za-z]', text)
>>> ['I','l','o','v','e','y','o','u']

영어 텍스트도 한글 텍스트와 원리가 비슷하고, 오히려 더 쉽다고 볼 수 있다. [A-Z]를 하면 'A'와 'Z'사이에 있는 대문자만 가져오고, [a-z]를 하면 사이에 있는 소문자만 가져온다.

만약에 대문자와 소문자를 다 가져오고 싶으면 위에서 배운 합집합의 원리를 통해 [A-Za-z]를 하면 모든 영문자를 다 가져올 수 있다.


숫자 텍스트

hp = '제 전화번호는 010-1234-5678입니다.'

re.findall('[0]', hp)
>>> ['0','0']

re.findall('[0-9]', hp)
>>> ['0','1','0','1','2','3','4','5','6','7','8']

re.findall('[전화번호|제가]', hp)
>>> ['제','전','화','번','호']

숫자 텍스트는 0과 9사이의 숫자밖에 없기 때문에 [0-9]라고 표현해서 모든 숫자를 가져올 수 있고, [0]만 표시한다면 0이라는 숫자만 반환해줘서 '0'이 두 번 출력된다.

그리고 |이라는 합집합 기호를 통해 원하는 문자의 낱글자들을 합칠수가 있다. [전화번호|제가]라고 표현하면 ['제','전','화','번','호']를 출력하게 된다.

 

 


다음 글에 이어서 진행됩니다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기