본문 바로가기

Python_Beginer/Study

190217> Python 정규표현식 연습

import re

data = """
park 800905-1049118
kim 700905-1059119
"""

pat = re.compile('(\d{6})[-]\d{7}') # 숫자 6자리 - 숫자 7자리
# print(pat.sub('\g<0>', data)) # 0은 전체를 의미
# print(pat.sub('\g<1>', data)) # 1은 \d{6}
# print(pat.sub('\g<2>', data)) # 2는 \d{7}
print(pat.sub('\g<1>-*******', data)) # 뒷자리를 *로 마킹

import re
s = 'Apple is a big company and apple is very delicious.'
c = re.compile('apple')
result = c.findall(s)
print(result)

# 자바, c에서는 안되고, 파이썬에서만 문자 * 숫자가 가능함
name = '안기웅'
print(name * 2)

import re
p = re.compile('ab*') # a, ab, abbb~

import re
p = re.compile('[a-z]+') # a, z, b, apple 소문자 영어만 가능. 대문자나 숫자 한글은 사용불가능
p = re.compile('[a-zA-Z0-9]+')

import re
sample = 'apple'
p = re.compile('[a-z]+')
result = p.match(sample)
print(result)

import re
sample = 'APPLE'
p = re.compile('[a-z]+')
result = p.match(sample)
print(result)

import re
p = re.compile('[a-z]+')
m = p.match('3 python')
if m:
print('match')
else:
print('not match')

import re
p = re.compile('[a-z]+')
m = p.search('3 python')
print(m)

import re
p = re.compile('[a-z]+')
result = p.findall('life is too short')
print(result)

import re
p = re.compile('[a-z]+')
result = p.finditer('life is too short')
print(result)

import re
p = re.compile('[a-z]+')
m = p.match('python')
result1 = m.group()
result2 = m.start()
result3 = m.end()
result4 = m.span()
print(result1)
print(result2)
print(result3)
print(result4)

import re
p = re.compile('[a-z]+')
m = p.search('python')
result1 = m.group()
result2 = m.start()
result3 = m.end()
result4 = m.span()
print(result1)
print(result2)
print(result3)
print(result4)

import re
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)

import re
p = re.compile('a.b', re.S)
m = p.match('a\nb')
print(m)

import re
p = re.compile('[a-z]', re.IGNORECASE)
rs1 = p.match('python')
rs2 = p.match('Python')
rs3 = p.match('PYTHON')
print(rs1)
print(rs2)
print(rs3)

import re
p = re.compile('[a-z]', re.I)
rs1 = p.match('python')
rs2 = p.match('Python')
rs3 = p.match('PYTHON')
print(rs1)
print(rs2)
print(rs3)

import re
p = re.compile("^python\s\w+", re.MULTILINE)
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))

import re
p = re.compile("^python\s\w+", re.M)
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data))

charref = re.compile(r'&[#](0[0-7]+|[0-9]+|[0-9a-fA-F]+);') #0[0-7] or 0-9]+ or [0-9a-fA-F]+

charref = re.compile(r"""
&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
|[0-9]+ # Decimal form
|[0-9a-fA-F]+ # Hexadcimal form
) # Trailing semicolon
;""", re.VERBOSE)

import re
p = re.compile(r'\\section')
print(p)

import re
p = re.compile('Crow|Servo')
m = p.match('CrowHello')
m1 = p.match('HelloCrow')
print(m)
print(m1)

print(re.search('^Life', 'Life is too short'))
print(re.search('^Life', 'My Life'))

print(re.search('com$', 'www.naver.com'))
print(re.search('kr$', 'www.naver.co.kr'))

# 회사 사번 = com_number
com_number = ['20170203 1', '20180101 23', '20190217 1', '20190217 2', '20190217 3']
for result in com_number:
result_2018 = re.search('^2018', result)
result_2019 = re.search('^2019', result)
if bool(result_2019) == True:
print('2019년 입사자')
elif bool(result_2018):
print('2018년 입사자')
else:
print('2017년 입사자')

# ftp 로 시작하는 웹 사이트 주소
web_site = ['www.naver.com', 'www.lycos.co.kr', 'www.daum.net', 'ftp://10.184.70.11:8080', 'ftp://10.2.2.3:8080']
for result in web_site:
ftp_bool = re.search('^ftp', result)
www_bool = re.search('^www', result)
com_bool = re.search('com$', result)
if bool(ftp_bool) == True:
print('파일 전송 프로토콜')
elif bool(www_bool) == True :
print('web site')
else:
print('com올 끝나는 site ')

import re
p = re.compile(r'\bclass\b')
print(p.search('no class at all'))

import re
p = re.compile(r'\bclass\b')
print(p.search('the declassfied algorithm'))

import re
p = re.compile(r'\Bdong\B')
print(p.search('shindongwook'))

import re
p = re.compile(r'\BNorth Korea\B')
print(p.search('Noth Korea 북미회담을 개최하였다.'))

import re
p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
print(m)
print(m.group(0))

import re
p = re.compile(r"(\w+)\s+(\d+[-]\d+[-]\d+)")
m = p.search("park 010-1234-1234")
print(m)
print(m.group(2))

import re
p = re.compile(r"(\w+)\s+(\d+[-]\d+[-]\d+)")
m = p.search("park 010-1234-1234")
name = m.group(1)
tel = m.group(2)
print(name)
print(tel)

import re
p = re.compile(r"(\d+)\s+(\w+)\s+(\w+)")
m = p.search("20190217 Sunny 20도")
date = m.group(1)
weather = m.group(2)
degree = m.group(3)
print("오늘의 날짜는 {} 입니다.".format(date))
print("오늘의 날씨는 {} 입니다.".format(weather))
print("금일 온도는 {} 입니다.".format(degree))

import re
p = re.compile(r"(\w+)\s+((\d+)[-]\d+[-](\d+))")
m = p.search("park 010-1234-1234")
first_num = m.group(3)
last_num = m.group(4)
print(first_num)
print(last_num)

import re
p = re.compile(r'(\b\w+)\s+\1')
print(p.search('Paris in the the spring').group())

import re
p = re.compile(r'(?P<name>\w+)\s+(?P<tel>(\d+)[-]\d+[-]\d+)')
m = p.search('park 010-1234-1234')
print(m.group('name'))
print(m.group('tel'))

import re
p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)')
print(p.search('Paris in the the spring').group())

import re
p = re.compile('.+:')
m = p.search('http://google.com')
print(m.group())

import re
p = re.compile('.+(?=:)')
m = p.search('http://google.com')
print(m.group())

import re
p = re.compile('.+(?=//)')
m = p.search('http://google.com')
print(m.group())

import re
p = re.compile('.*[.].*$')
m = p.search('sendmail.cf') # pdf 뷰어에서 열 수 있는 파일이면 열고, 아니면 못 연다고 팝업을 만듬
print(m.group())

import re
p = re.compile('.*[.][^b].*$')
m = p.search('sendmail.bat') # b라는 문자로 시작하면 안된다는 의미(ex.bat인 파일은 제외해야 한다)
print(m)

import re
p = re.compile('.*[.][b].*$')
m = p.search('sendmail.bat')
print(m)

import re
p = re.compile('.*[.]([^b]..|.[^a].|..[^t])$') # b로 시작하면 안되고, 중간 글자가 a면 안되고, 끝 문자가 t면 안됨
m = p.search('sendmail.bat')
print(m)

import re
p = re.compile('.*[.]([^b]..|.[^a].|..[^t])$') # b로 시작하면 안되고, 중간 글자가 a면 안되고, 끝 문자가 t면 안됨
m = p.search('sendmail.com')
print(m)

import re
p = re.compile('.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$')
m = p.search('sendmail.bar')
print(m)

import re
p = re.compile('.*[.](?!bat$|exe$).*$')
m = p.search('sendmail.bat') # bat, exe로 끝나지 않는 것
print(m)

import re
p = re.compile('(blue|white|red)')
print(p.sub('colour', 'blue socks and red shoes'))

import re
p = re.compile('abc1234')
password = p.sub('def5678', 'abc1234') # 기존 비밀번호 변경 시 적용
print(password)

import re
p = re.compile('(blue|white|red)')
print(p.sub('colour', 'blue socks and red shoes', count = 1)) # 첫번재 위치에 있는거 한개만 바꾸기

import re
p = re.compile('(blue|white|red)')
print(p.subn('colour', 'blue socks and red shoes'))

# 전화번호 + 정규식 예
import re
p = re.compile(r"\w+\s+\d+[-]\d+[-]\d+")
m = p.search("park 010-1234-1234")
print(m)

# 이메일 정규식 예
import re
p = re.compile('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$')
m = p.match("ankiwoong@cj.net")
print(m)

# 정규식+VERBOSE+적용_이메일+주소+검색
import re
p = re.compile(r'''
^[_a-z0-9-]+
(.[_a-z0-9-]+)*
@
[a-z0-9-]+
(.[a-z0-9-]+)*$
''', re.VERBOSE)
# p = re.compile(r'''
# (^[_a-z0-9-]+)
# (.[_a-z0-9-]+)*
# @
# ([a-z0-9-]+)
# (.[a-z0-9-]+)*$
# ''', re.VERBOSE)
m = p.match("20sky.love@naver.com")
print(m)
print(m.group(1))
print(m.group(2))
# print(m.group(1))
# print(m.group(2))
# print(m.group(3))
# print(m.group(4))

# 그룹핑 - 이름 중간자리 별표
import re
p = re.compile(r"(\w)(\w)(\w)")
m = p.search("안기웅")
print(m.group(1)+"*"+m.group(3))

# 그룹핑 - 전화번호 중간자리 별표
import re
p = re.compile(r"(\w+\s+\d+)[-](\d+)[-](\d+)")
m = p.search("안기웅 010-4694-9088")
print(m.group(1)) # 전화번호 중간자리

hidden_number=m.group(1) + "-****-" + m.group(3)
print(hidden_number)

# 오타 중복 추출
import re
p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)')
print(p.search('안 기 기 웅').group())

# 중복 문자 삭제
import re
s = 'I like 파이썬 programming, 신동욱'
#hangul = re.compile('[^ ㄱ-ㅣ가-힣]+') # 한글과 띄어쓰기를 제외한 모든 글자
hangul = re.compile('[가-힣]+') # 한글과 띄어쓰기를 제외한 모든 글자
# hangul = re.compile('[^ \u3131-\u3163\uac00-\ud7a3]+') # 위와 동일
result = hangul.sub('', s) # 한글과 띄어쓰기를 제외한 모든 부분을 제거
print (result)

result = hangul.findall(s) # 정규식에 일치되는 부분을 리스트 형태로 저장
print (result)

# 이름 + 전화번호의 문자열을 전화번호 + 이름으로 바꾸는 예
import re
p = re.compile(r'(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)')
seq = p.sub('\g<phone> \g<name>', 'park 010-1234-1234')
print(seq)

def hexrepl(match):
"Return the hex string for a decimal number"
value = int(match.group())
return hex(value)
p = re.compile(r'\d+')
p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')

import re
s = '<html><head><title>Title</title>'
len(s)
print(re.match('<.*>', s).span())
print(re.match('<.*>', s).group())

print(re.match('<.*?>', s).group())