먼저 정규표현식을 사용해 원하는 결괏값을 받아보았다. (IDLE 사용)
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> import re
>>> example = '이동민 교수님은 다음과 같이 설명했습니다(이동민, 2019). 그런데 다른 교수님은 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019). 또 다른 견해도 있었습니다(Lion, 2018)'
>>> result = re.findall(r'\([A-Za-z가-힣]+, \d+\)', example)
>>> result
['(이동민, 2019)', '(최재영, 2019)', '(Lion, 2018)']
>>>
're' 는 정규표현식 모듈로 먼저 import했다.
어떤 문자열(string)에서 패턴(pattern)을 찾을 때는 match를 사용하면 된다.
match 메서드는 해당 문자열의 가장 처음부터 원하는 패턴의 문자열을 찾는 명령이다.
기본 형식은 아래와 같다.
re.match(패턴, 문자열)
>>> pattern = r'life'
>>> script ='life'
>>> re.match(pattern, script)
<re.Match object; span=(0, 4), match='life'>
>>> re.match(pattern, script).group()
'life'
위와 같이 활용할 수 있다.
re.match(r'life','life').group()
'life'
이렇게 작성할 수도 있다.
이와 같이 매칭이 된 문자열을 반환한다
매칭이 되지 않는 경우에는 오류 메세지가 뜬다.
정규표현식에는 '매칭'을 찾는 것과 그것을 반환하는 것은 별개의 과정이라 조금 불편함을 느낄 수도 있다.
그래서 함수로 정의해 간단하게 사용해 볼 수도 있다.
>>> def refinder(pattern, script):
if re.match(pattern,script):
print('Match!')
else:
print('Not a match!')
>>> pattern = r'Life'
>>> script = 'Life is so cool'
>>> refinder(pattern, script)
Match!
그리고 match는 대소문자를 구분하므로 주의하도록 하자.
>>> pattern = r'is'
>>> script = 'Life is so cool'
>>> refinder(pattern, script)
Not a match!
위의 코드에서는 왜 Not a match!라고 뜨는 것일까?
match가 문자열의 시작부터 매칭되는지 찾는 함수이기 때문에 텍스트 중간에 있는 패턴을 찾지 못한다.
이번에는 match와 비슷하지만 조금은 다른 search를 이용해보자.
기본 사용법은 아래와 같다.
re.search(패턴, 문자열)
>>> pattern = r'is'
>>> script = 'Life is so cool'
>>> re.search(pattern, script).group()
'is'
search는 텍스트 중간에 패턴이 있는 경우에도 찾아낼 수 있다.
-패턴을 찾는 정규 표현식
정규표현식
|
설명
|
\d
|
숫자와 매치
|
\D
|
숫자가 아닌 것과 매치
|
\s
|
whitespace 문자와 매치
|
\S
|
whitespace가 아닌 것과 매치
|
\w
|
문자+숫자와 매치
|
\W
|
문자+숫자가 아닌 문자와 매치
|
\\
|
메타 문자가 아닌 일반 문자 역슬래시와 매치. 메타 문자 앞에 \를 붙이면 일반 문자를 의미
|
이번에는 아주 자주 사용되는 명령인 findall 메서드에 대해서 알아보자. 기본 사용법은 아래와 같다.
re.findall(패턴, 찾으려는 문자열)
findall 메서드는 특정 패턴을 문자열에서 모두 찾아서 리스트 형태로 반환한다.
search문이나 match문은 제대로 찾았는지 확인하는 절차가 따로 필요한 반면, findall로 찾으면 결괏값이
빈 리스트([])로 나온다는 점에서 유용하다!
다음과 같이 활용해 볼 수 있다.
>>> number = 'My number is 511223-1****** and yours is 521012-2******'
>>> re.findall('\d{6}',number)
['511223', '521012']
여기서 '\d{6}' 패턴은 숫자를 여섯 번 반복한 값을 의미한다.
정규 표현식에는 '탐욕스럽다'라는 개념이 있다. 문자를 집어삼킨다는 뜻으로, '.' 과 같은 문자는 모든 문자들을 의미하기 때문에 반복하면 모든 문자를 집어삼켜버린다.
예제를 통해 알아보자.
>>> example1 = '저는 91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년입니다.'
>>> re.findall(r'\d.+년', example1)
['91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년']
이와 같이 문장의 맨 앞의 숫자부터 맨 뒤의 '년'사이의 모든 문자를 반환해 버린다.
이러한 현상을 없애는 방법은 물음표(?)를 집어넣는 것이다.
>>> re.findall(r'\d.+?년', example1)
['91년', '97년', '2020년']
이렇게 물음표를 붙여주면 '년'이라는 글자를 찾고 패턴 찾기를 멈춘다.
또 다른 방법은 아래의 코드와 같이 숫자를 반복시킨 후 '년'으로 끝나는 문자를 찾아도 된다.
>>> re.findall(r'\d+.년', example1)
['91년', '97년', '2020년']
문자를 집어삼키는 또 다른 예시를 살펴보자.
>>> example = '이동민 교수님은 다음과 같이 설명했습니다(이동민, 2019). 그런데 다른 교수님은 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019). 또 다른 견해도 있었습니다(Lion, 2018)'
>>> result = re.findall(r'\(.+\)', example)
>>> result
['(이동민, 2019). 그런데 다른 교수님은 이 문제에 대해서 다른 견해를 가지고 있었습니다(최재영, 2019). 또 다른 견해도 있었습니다(Lion, 2018)']
물음표를 붙여서 해결할 수 있다.
>>> result = re.findall(r'\(.+?\)', example)
>>> result
['(이동민, 2019)', '(최재영, 2019)', '(Lion, 2018)']
이번에는 split 메서드에 대해 알아보자.
split은 특정한 패턴이 등장할 때 문자열을 나눈다. 기본 사용법은 아래와 같다.
re.split(패턴, 문자열)
패턴은 r'[.!?]' 로 쓴다. r을 쓰면 마침표, 느낌표, 물음표마다 역슬래시를 붙이지 않아도 되기 때문이다.
아래의 예시를 참고하자.
>>> sentence = 'I have a lovely dog, really. i am not telling a lie. What a pretty dog! I love this dog.'
>>> re.split(r'[.!?]', sentence)
['I have a lovely dog, really', ' i am not telling a lie', ' What a pretty dog', ' I love this dog', '']
>>> data = 'a:3;b:4;c:5'
>>> for i in re.split(r';',data):
print(re.split(r':',i))
['a', '3']
['b', '4']
['c', '5']
위와 같이, 세미콜론(;)으로 한번 쪼갠 뒤에 다시 콜론(:)을 기준으로 나누면 데이터셋을 만들 수 있다.
이번에는 sub메서드에 대해서 알아보자. 문자를 대체하는 것으로 정말 많이 사용되는 메서드이다.
기본 사용법은 아래와 같다.
re.sub(찾을 패턴, 대체할 문자, 찾을 문자열)
'찾을 문자열'에서 '패턴'을 찾아서 '대체할 문자'로 바꿔주는 것이다.
아래 예제를 참고하자.
>>> sentence = 'I have a lovely dog, really. i am not telling a lie. What a pretty dog! I love this dog.'
>>> re.sub(r'dog','cat', sentence)
'I have a lovely cat, really. i am not telling a lie. What a pretty cat! I love this cat.'
>>>
sub 메서드는 특히 불필요한 공백을 없애는 데 많이 사용된다!
다음과 같이 줄바꿈이 일어나는 경우를 살펴보자.
>>> words = 'I am home now. \n\n\nI am with my cat.\n\n'
>>> print(words)
I am home now.
I am with my cat.
>>> re.sub(r'\n','',words)
'I am home now. I am with my cat.'
출처: