빅데이터 프로그래밍/Python

[Python] 24. Regular Expression(정규 표현식) 기본 문법 실습 2, Pyperclip library, cx_freeze로 EXE 만들기

밍글링글링 2017. 8. 5.
728x90
01. 정규 표현식 기본 문법 실습 2
 
1. 와일드카드 문자, 줄바꿈 문자의 처리
- .: 줄바꿈을 제외한 하나의 문자와 대응
- *: 모든 문자와 대응, 앞에 나오는 문자가 없거나 한번 이상 대응
- .*: 모든 문자와 대응, 앞에 나오는 문자가 없거나 한번 이상 대응, 가장 긴 문자열 최대 일치,
     줄바꿈을 제외한 모든문자
- .*?: 모든 문자와 대응, 앞에 나오는 문자가 없거나 한번 이상 대응, 가장 짧은 문자열 최소 일치
- (?!:).)*: ':'을 제외한 모든 문자
- re.DOTALL, r.S: 소스 문자열에 줄바꿈이 명시되어 있으면 출력 결과도 여러줄에 출력, new line 대응
- re.IGNORECASE, r.I: 대소문자 무시
- re.VERBOSE: 정규 표현식안에 주석을 명시 할 수 있음

- re.sub('[a-zA-Z]', '', source_text): 영문 대소문자 제거
  . re.sub(pattern, repl, string): string에서 pattern과 일치하는 부분에 대하여
                                       repl로 교체하여 결과 문자열을 반환함
- re.sub('[\{\}\[\]\/?.,;:|\)*~`!^\-_+<>@\#$%&\\\=\(\'\"]', '', src_text): 특수 문자 제거

* PyDev 에서는 re.DOTALL 인식이 안됨으로 IDLE를 사용 할 것.
 
 
[실행 화면]
['cat', 'hat']
cat
hat
--------------------------------------------
<class '_sre.SRE_Match'>
Python
developer
--------------------------------------------
<To serve man> for dinner.>
<To serve man>
--------------------------------------------
Python 
Python 
데이터분석 분야 
크롤링분야
Python 
데이터분석 분야 
크롤링분야
--------------------------------------------
Python
Python
--------------------------------------------
 
▷ /reexam/re06.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import re

if __name__ == '__main__':
    reg = re.compile(r'.at')
    regre = reg.findall('The cat int the hat.')
    print(regre)     # ['cat', 'hat']
    print(regre[0])  # 첫번째 요소 cat 
    print(regre[1])  # 두번째 요소 hat
    print('--------------------------------------------') 
    reg = re.compile(r'First Name: (.*) Last Name: (.*)')
    regre = reg.search('First Name: Python Last Name: developer')
    print(type(regre))         # <class '_sre.SRE_Match'>
    print(type(regre.group())) # <class 'str'>
    print(regre.group())  # First Name: Python Last Name: developer
    print(regre.group(0)) # First Name: Python Last Name: developer
    print(regre.group(1)) # 첫번째 그룹: Python
    print(regre.group(2)) # 두번째 그룹: developer
    print('--------------------------------------------') 
    reg = re.compile(r'<.*>')
    regre = reg.search('<To serve man> for dinner>')
    print(regre.group()) # <To serve man> for dinner>

    regre = reg.search('<To serve man> for dinner.>')
    print(regre.group())
    reg = re.compile(r'<.*?>') # <To serve man> for dinner.>
    regre = reg.search('<To serve man> for dinner.>')
    print(regre.group()) # <To serve man>
    print('--------------------------------------------')
    reg = re.compile(r'.*')
    regre = reg.search('Python \n데이터분석 분야 \n크롤링분야')
    print(regre.group())  # Python, \n앞에서 짤림
    
    reg = re.compile(r'.*', re.DOTALL)
    regre = reg.search('Python \n데이터분석 분야 \n크롤링분야')
    print('re.DOTALL: ' + regre.group())
    '''
    re.DOTALL: Python 
    데이터분석 분야 
    크롤링분야
    '''
    reg = re.compile(r'.*', re.S)
    regre = reg.search('Python \n데이터분석 분야 \n크롤링분야')
    print('re.S: ' + regre.group())
    '''
    re.S: Python 
    데이터분석 분야 
    크롤링분야
    '''
    print('--------------------------------------------')
    reg = re.compile(r'python', re.IGNORECASE)
    regre = reg.search('Python \n데이터분석 분야 \n크롤링분야')
    print(regre.group())
    
    reg = re.compile(r'python', re.I)
    regre = reg.search('Python \n데이터분석 분야 \n크롤링분야')
    print('re.I: ' + regre.group())
    print('--------------------------------------------')    
   

-------------------------------------------------------------------------------------
 
 

2. 문자열의 대체, 문자열의 일부만 공개하기

- reg = re.compile(r'데이터분석 (\w)\w*')

  regre = reg.sub('기계 학습', 'Python은 데이터분석 분야에 데이터 분석'): 원본 문자열의 변환 
  가**, 나**, 다** 
- re.VERBOSE: 정규 표현식에 주석 명시 가능


[실행 화면]
Python은 기계 학습 데이터 분석
--------------------------------------------
**동, **동, **순
가**, 나**, 다**
000-1111-2222
000-1111-2222
000
1111
2222
('000', '1111', '2222')
 
▷ /reexam/re07.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import re

if __name__ == '__main__':
    # 데이터분석 에
    # 데이터분석 중요
    # 데이터분석 시에
    reg = re.compile(r'데이터분석 \w+') 
    regre = reg.sub('기계 학습', 'Python은 데이터분석 중요 데이터 분석')
    print(regre) # Python은 기계 학습 데이터 분석
    print('--------------------------------------------')
    reg = re.compile(r'개발자 (\w)*') # **동 **동 **순 
    regre = reg.sub(r'***\1', '개발자 가길동, 개발자 나길동1, 개발자 다길순이하')
    print(regre)  # ***동, ***1, ***하
    
    reg = re.compile(r'개발자 (\w)\w*') # 가** 나** 다** 
    regre = reg.sub(r'\1**', '개발자 가길동, 개발자 나길동, 개발자 다길순')
    print(regre)
    
    print('--------------------------------------------')
    reg = re.compile(r'''
    (\d\d\d)     # telecom
    -
    (\d\d\d\d)   # number1
    -
    (\d\d\d\d)   # number 2
    ''', re.VERBOSE)
    regre = reg.search('나의 전화번호는 000-1111-2222  입니다.')
    print(regre.group())   # 000-1111-2222   
    print(regre.group(0))  # 000-1111-2222
    print(regre.group(1))  # 000
    print(regre.group(2))  # 1111
    print(regre.group(3))  # 2222
    print(regre.groups())  # tuple ('000', '1111', '2222')

    
-------------------------------------------------------------------------------------
  
 

 

02. Pyclip library의 사용

1. 클립보드의 이용 
 

1) Pyperclip 설치
C:\Users\soldesk8>pip install pyperclip
Collecting pyperclip
  Downloading pyperclip-1.5.27.zip
Installing collected packages: pyperclip
  Running setup.py install for pyperclip ... done
Successfully installed pyperclip-1.5.27
 
C:\Users\soldesk8>pip list
pip (9.0.1)
pyperclip (1.5.27)
setuptools (28.8.0)

 

[실행 화면]

1 단계: clipboard로 복사
가길순 000-1111-2222 mail1@mail.com
나길순 111-1111-2222 mail2@mail.com
다길동 (222)-1111-2222 mail3@mail.com
  
2 단계: Python 실행
<class 'str'>
<class 'list'>
['가길순 000-1111-2222 mail1@mail.com\r', '나길순 111-1111-2222 mail2@mail.com\r', '다길동 (222)-1111-2222 mail3@mail.com']
가길순 000-1111-2222 mail1@mail.com
나길순 111-1111-2222 mail2@mail.com
다길동 (222)-1111-2222 mail3@mail.com
 
3 단계: clipboard의 내용 Editplus로 붙여넣기
-------------------------------------
        여행자 명단입니다.
-------------------------------------
가길순 000-1111-2222 mail1@mail.com
나길순 111-1111-2222 mail2@mail.com
다길동 (222)-1111-2222 mail3@mail.com
  
▷ /reexam/re08.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import pyperclip

if __name__ == '__main__':
    # clipboard에서 문자열 가져오기
    text = str(pyperclip.paste())
    print(type(text))
    text2 = text.split("\n")
    print(type(text2))
    print(text2)
    
    target = ''
    for line in text2:
        line = line.replace("\r", "")
        target += line + "\n"
    print(target)
    
    output = '-------------------------------------\n'
    output += '        여행자 명단입니다.\n'
    output += '-------------------------------------\n'
    output += target;
    pyperclip.copy(output)
        
'''
가길순 000-1111-2222 mail1@mail.com
나길순 111-1111-2222 mail2@mail.com
다길동 (222)-1111-2222 mail3@mail.com
'''        

-------------------------------------------------------------------------------------
 

 

2. 정규 표현식과 Pyperclip의 연동

1 단계: clipboard로 복사
가길순 000-1111-2222 mail1@mail.com
나길순 111-1111-2222 mail2@mail.com
다길동 (222)-1111-2222 mail3@mail.com
  
2 단계: Python 실행
phoneRegex.findall(text): 3
emailRegex.findall(text): 3
Clipboard로 복사했습니다.
000-1111-2222
111-1111-2222
(222)-1111-2222
mail1@mail.com
mail2@mail.com
mail3@mail.com
 

3 단계: clipboard의 내용 Editplus로 붙여넣기

000-1111-2222
111-1111-2222
(222)-1111-2222
mail1@mail.com
mail2@mail.com
mail3@mail.com
 
 
[실행 화면]
  
▷ /reexam/re09.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import re, pyperclip

if __name__ == '__main__':

    reg = re.compile(r'.')        # 하나의 문자가 나타나는 경우
    regre = reg.search('ABCDE.')
    print(regre.group())          # A
     
    reg = re.compile(r'\.')       # .이 나타나는 경우
    regre = reg.search('ABCDE.FGHI')
    print(regre.group())          # .

    # 전화 번호 정규 표현식
    phoneRegex = re.compile(r'''(
      (\d{3}|\(\d{3}\))?  # 000 or (000) 과 0번 또는 1번 나타나는 것과 일치
      (\s|-|\.)?          # 빈칸, 탭또는 줄바꿈 문자, -, .문자가 나타나는 것과 일치
      (\d{4})             # number 1
      (\s|-|\.)?          # 빈칸, 탭또는 줄바꿈 문자, -, .문자가 나타나는 것과 일치
      (\d{4})             # number 2
    )''', re.VERBOSE)
    
    # 이메일 정규 표현식, []: 문자 나열
    emailRegex = re.compile(r'''(
      [a-zA-Z0-9._%+-]+  # 1번 이상 등장
      @                  # @
      [a-zA-Z0-9.-]+     # gmail domain
      (\.[a-zA-Z]{2,4})  # .kr, .com 등 .korea X
    )''', re.VERBOSE)

    # clipboard에서 일치하는 모든 문자열 찾기
    src = str(pyperclip.paste())
    srclist = src.split("\n")
    text = ''
    for line in srclist:
        line = line.replace("\r", "") # \r: Careage Return 제거
        text += line + "\n"
        
    matches = [] # list
    print('phoneRegex.findall(text): ' + str(len(phoneRegex.findall(text))))

    print(type(phoneRegex.findall(text)))  # <class 'list'>
          
    for groups in phoneRegex.findall(text): # 전화번호 검색
        # mail1@mail.com
        phoneNum = '*'.join([groups[1], groups[3], groups[5]])
        matches.append(phoneNum)
        '''
        000*1111*2222
        111*1111*2222
        (222)*1111*2222
        '''
        
    print('emailRegex.findall(text): ' + str(len(emailRegex.findall(text))))
    for groups in emailRegex.findall(text):
        matches.append(groups[0]) # mail1@mail.com
                                
    # clipboard로 붙이기
    if len(matches) > 0:
        pyperclip.copy('\n'.join(matches))
        print('Clipboard로 복사했습니다.')
        print('\n'.join(matches)) # 라인 변경 추가
    else:
        print('전화번호나 이메일 주소가 없습니다.')                             
                                 
'''
가길순 000-1111-2222 mail1@mail.com
나길순 111-1111-2222 mail2@mail.com
다길동 (222)-1111-2222 mail3@mail.com
'''        
      
                                

-------------------------------------------------------------------------------------
 
 
 
04. cx_freeze로 EXE 만들기
 
 
 
2. install
   
pip install cx_freeze
 
 
3. script 생성
 
▷ /reexam/Setup.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import sys
from cx_Freeze import setup, Executable

setup(name = "Pyperclip",
        version = "1.0",
        description = "Pyperclip phone email filter",
        author = "dev",
        executables = [Executable("re09.py")])        
        # executables = [Executable("re09.py", base="Win32GUI")])
        
-------------------------------------------------------------------------------------
 
 
4. 실행
 
setup.py build

build/exe.win-amd64-3.6/re09.exe 실행

728x90

댓글