본문 바로가기
Language/Python

2021 - 04 - 17, Python 학습 - 정규표현식(Regular Expression)

by Cs.Woo 2021. 4. 17.

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(patternscript):

    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.