import re # 정규표현식을 사용하기 위해서는 모듈 re를 임포트 해야한다
## 1 match 메소드 (문자열에서 패턴찾기)
# re.match(패턴, 문자열)
pattern = r'life' # 패턴을 객체에 저장, 패턴앞에는 r을 붙여준다.
script = 'life' # 패턴과 같은 스크립트를 다른 객체에 저장
re.match(pattern, script) # script에서 pattern을 찾으시오
print(re.match(pattern, script)) # <re.Match object; span=(0, 4), match='life'>
re.match(pattern, script).group() # groupe() 메소드를 이용하여 매치된 내용을 반환
print(re.match(pattern, script).group())
# 상기의 코드는 다음과 같이 쓸 수 있다.
re.match(r'life', 'life').group() # 문자열 life에서 life라는 패턴을 찾아서 반환하시오
print(re.match(r'life', 'life').group()) #life
# 다음의 코드는 매치가 되지 않기 때문에 에러가 발생한다
# re.match(r'life', 'animal').group() # 문자열 animal에서 life 를 찾아 반환하시오
# 정규표현식에서 매칭을 찾는것과 반환하는것은 별개의 과정 따라서 원고에 패턴이 있는지
# 쉽게 확인할 수 있는 조건문을 만들기도 한다. 다음과 같다.
def refinder(pattern, script):
if re.match(pattern,script):
print("match!")
else:
print("not a match!")
new_pattern = r'Life'
new_script = 'Life is so cool'
# match는 대소문자를 구별한다 패턴이 Life면 Life는 매치지만, life는 매치가 아니다.
# 그리고 match는 텍스트 중간에 있는 패턴도 찾지를 못한다 가령
# 상기의 script의 중간에 is를 찾기위해 패턴으로 r'is'를 할당한다고 해도
# 결과는 not match가 된다, 즉 match는 텍스트 중간의 값을 매치하지 못하는 것이다.
## 2 Search메소드 (문자열 전체에서 패턴찾기)
# search는 match와 사용법이 같다
# re.search(패턴, 문자열)
# match와 다른 점은 다음과 같다.
new_script = 'Life is so cool'
print(re.search(r'Life',new_script).group()) # 'LIfe'
print(re.search(r'is',new_script).group()) # 'is'
print(re.search(r'so',new_script).group()) # 'so'
print(re.search(r'cool',new_script).group()) # 'cool'
## 3 findall 메소드 (패턴을 모두 찾아 리스트로 반환)
# re.findall(패턴, 찾으려는 문자열)
# findall은 문자열에서 특정 패턴을 모두 찾아서 리스트로 반환하는 기능을 갖고 있다.
# 또한, search문이나 match문에서는 제대로 됐는지 확인을 하여야 하지만
# findall문은 빈 리스트[]로 반환하기 때문에 확인할 필요가 없다.
number = 'my number is 511223-1****** and your is 521012-2******'
re.findall('\d{6}', number)
print(re.findall('\d{6}', number)) # ['511223', '521012']
# 문자열을 사용할 때에는 앞에 r을 붙여주는 것이 좋다.
# 이스케이프의 일종인데 앞에 r을 붙여주면 \를 명령어로 인식하지않고
# 문자로 인식하게된다.
# 정규표현식에는 탐욕이라는 개념이 존재한다.
# 탐욕은 .을 의미하는데 여기서 .은 전체문자를 인식하기때문에 모든 글자를
# 긁어오게 되는 불상사를 발생시킨다. 내용은 다음과 같다.
example1 = '저는 91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년입니다.'
re.findall(r'\d.+년', example1)
# 숫자(\d)로 시작하고, 어떤문자(.)든 반복(+)되며, 년 으로 끝나느 문자열을 반환하라고 명령한다.
print(re.findall(r'\d.+년', example1)) # ['91년에 태어났습니다. 97년에는 IMF가 있었습니다. 지금은 2020년']
# 탐욕을 멈추게 하는 방법이 존재한다. 다음과 같다.
re.findall(r'\d.+?년', example1)
# '년'이라는 글자를 찾으면 패턴찾기를 멈춘다.
re.findall(r'\d+.년', example1)
# 숫자를 반복시킨후 년으로 끝나는 문자를 찾아도 된다.
print(re.findall(r'\d.+?년', example1)) # ['91년', '97년', '2020년']
print(re.findall(r'\d+.년', example1)) # ['91년', '97년', '2020년']
## 4 split 메소드(문장을 나누는 패턴 만들기)
# re.split(패턴, 문자열)
# split은 특정한 패턴이 나올때 문장을 나누는 기능을 갖고있다.
# split에서 패턴은 r'[.!?]'를 사용하면된다.
# 이스케이프 r을 사용하였기 때문에 각 특수문자 앞에\를 붙이지 않아도 된다.
sentence = 'I love a lovely dog, really. I am not telling a lie. What a pretty dog! I love this dog.'
re.split(r'[.!?]', sentence)
# ['I love a lovely dog, really', ' I am not telling a lie', ' What a pretty dog', ' I love this dog', '']
# 마지막 마침표까지 다음문장으로 인식하였기 때문에 빈 문자열이 추가가 되었다.
print(re.split(r'[.!?]', sentence))
# 또한 split은 문장을 나눌 때에 유용성이 국한되는 것이 아니라, 다음과 같을 때에도
# 유용하게 사용할 수 있다.
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']
## 5 sub 매소드 (문자열 바꾸기)
# re.sub(찾을 패턴, 대체할 문자, 찾을 문자열)
sentence = 'I love a lovely dog, really. I am not telling a lie. What a pretty dog! I love this dog.'
# sentence를 dog이 아니라 cat으로 바꿔보기
re.sub(r'dog', 'cat', sentence) #sentence 라는 문자열에서 dog을 cat으로 바꾸어라.
print(re.sub(r'dog', 'cat', sentence))
#I love a lovely cat, really. I am not telling a lie. What a pretty cat! I love this cat.
# re.sub()의 기능은 웹파일의 공백을 지울 때 유용하게 사용할 수 있다.
words = 'I am home now. \n\n\nI am with my cat.\n\n'
print(words)
# re.sub()으로 공백을 지워보기
re.sub(r'\n', '',words)
print(re.sub(r'\n', '',words)) #I am home now. I am with my cat.
'Language > Python' 카테고리의 다른 글
2021 - 04 - 19, Python 학습 - 연습문제 풀이 (0) | 2021.04.19 |
---|---|
2021 - 04 - 18, Python 학습 - 모델링, 메소드 (0) | 2021.04.18 |
2021 - 04 - 17, Python 학습 - os모듈 (0) | 2021.04.17 |
2021 - 04 - 16, Python 학습 - 함수 I (0) | 2021.04.16 |
2021 - 04 - 15, Python 학습 - 문법 3 (0) | 2021.04.15 |