[Python][TIL] 정규 표현식(regular expression), DB 구축

PART 01 정규표현식(regular expression) : 패턴을 찾아내는 식
정규표현식은 복잡한 문자열을 처리할 때 사용하는 기법으로, python만의 고유 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다. 정규 표현식을 배우는 것은 python을 배우는 것과 또 다른 영역의 과제이다. 간단히 줄여서 "정규식"이라고도 말한다.
#문자 클래스 []
#[] 안의 두 문자 사이에 하이픈(-)을 사용하면, 두 문자 사이의 from-to를 의미!!
\d : 숫자와 매치 [0-9]
\D : 숫자가 아닌것과 매치 [^0-9]
\s : whitespace 문자와 매치 [\t\n\r\f\v]
\S : whitespace 문자가 아닌것과 매치 [^ \t\n\r\f\v]
\w : 문자 + 숫자 매치 [a-zA-Z0-9]
\W : 문자 + 숫자 아닌것과 매치 [^a-zA-Z0-9]
\\ : 문자로서의 역슬래시와 매치
정규표현식의 함수를 사용하기 위해 아래와 같이 re 모듈을 불러온다
import re
간단한 숫자 패턴을 찾아 list로 반환하는 걸 실행해보자!
상황) 숫자 연속되는 6자리만 찾아내세요
num = 'my number is 631215-1****** and yours is 721103-2******'
num1 = 'my number is 631215-1****** and yours is 7t1103-2******' #중간에 문자가 들어가면
re.findall('\d{6}', num)
re.findall('\d{6}', num1) #완전한 숫자인 631215만출력
■ Dot(.) 메타 문자의 사용
정규 표현식의 Dot(.)은 줄바꿈 문자인
\n
을 제외한 모든 문자와 매치됨을 의미한다.
a.b
의 의미는 "a + 모든문자 + b" 와 같다.
즉, a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미이다.
aab, a0b, acb 모두 a.b로 매치될 수 있다!
■ 반복 (+) 메타 문자의 사용
+는 최소 1번 이상 반복될 때 사용한다. 즉, *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.
ca+t
의 의미는 "c + a(1번 이상 반복) + t" 와 같다.
즉, ct (매치 X), cat (매치 O), caaaaaat (매치 O) 처럼 a가 1번 이상 반복되면 매치될 수 있다!
■ 메소드 re.findall(패턴, 찾으려는 문자열) -> 패턴(문자열 substring)을 모두 찾아 list의 요소로 반환시켜준다!
ex1 = '큰 딸은 2014년에 작은 딸은 2018년에 태어났습니다. 현재는 2021년입니다.'
# . : 뒤에 어떤 문자이든,
# + : 반복되며
re.findall('\d.+년',ex1)
# ? : 딱 요 패턴 친구들만 뽑아주겠어?라는 의미
re.findall('\d.+?년',ex1)
ex2 = '''enkim의 설명에 따르면 모든 것이 그렇다고 단정 지으면 안된다고 했습니다. (enkim, 2021) 하지만 김에녹은 모든 것을 단정 지었습니다. (김에녹, 2000) 이성민은 이런 일이 있을 것이라 예견했습니다. (이성민,1930)'''
res1 = re.findall(r'\(.+\)', ex2)
print(res1)
res2 = re.findall(r'\(.+?\)', ex2)
print(res2)
text = '저는 사랑스런 강아지를 데리고 있어여, 정말 입니다. 그런데, 요즘은 정말 말을 안듣습니다! 어떻게 할까요?'
#'~다'로 끝나는 문자+숫자 열을 출력해라!
re.findall(r'\w+다',text)
■ 메소드 split('찾을 패턴', 문자열 혹은 변수)
findall() 함수의 '찾을 패턴'에서 맨 앞글자 'r'의 의미는, 찾을 패턴 문자마다 역슬래시를 적어줘야 하는데, 고것을 한방에 적어준다!는 의미이다.
text = '저는 사랑스런 강아지를 데리고 있어여, 정말 입니다. 그런데, 요즘은 정말 말을 안듣습니다! 어떻게 할까요?'
spl1 = re.split('[\,\.\?\!]',text) #찾을 패턴 문자마다 \를 적어줘야하는데,
spl2 = re.split(r'[,.?!]',text) #고것을 한방에 적어준다!는 의미이다
data = 'test1 : 35;test2 : 4;test3 : 37' #요렇게 ;로 구분된 문자열이 있을 경우
for i in re.split(r';', data): #split()를 통해 data변수를 ;기준으로 자른다.
print(re.split(r':',i)) #위에서 자른 것을 다시 :기준으로 자른다.
■ 문자열 바꾸기
import re
text = '저는 사랑스런 강아지를 데리고 있어여, 정말 입니다. 그런데, 요즘은 정말 말을 안듣습니다! 어떻게 할까요?'
re.sub(r'강아지','코끼리',text)
■ 텍스트 파일(.txt)을 열어서, 읽은 후, 파일로 저장하고 정규표현식 사용하기!
f = open('C:/Users/Playdata/.spyder-py3/friends101.txt','r',encoding = 'utf-8')
sc101 = f.read()
print(sc101)
print(sc101[:100])
f.close()
#'Monica:~'모니카가 한 대사만 문자열을 검색하여 line이라는 list변수에 저장한다
line = re.findall(r'Monica:.+',sc101)
#monica가 한 대사만 추출하여 txt파일로 저장하려고 한다!
f = open('C:/Users/Playdata/.spyder-py3/monica.txt','w',encoding = 'utf-8')
monica = '' #초기화
for i in line:
monica += i +'\n' #줄바꿈에 의해
f.write(monica) #파일에 적는다
f.close() #를 해야 비로소 파일이 monica.txt로 저장됨!
#line에 있는 모든 str들을 컬럼 형태로 출력해보자!
for item in line[:]:
print(item)
■ 메소드 compile() : 텍스트 파일 속의 어떤 형태의 문자열 부분을 찾아 변수로 저장해놓고, findall로 추출한다
import re
f = open('C:/Users/Playdata/.spyder-py3/friends101.txt','r',encoding = 'utf-8')
sc101 = f.read()
# 등장인물 : 대문자 + 소문자 + :
char = re.compile(r'[A-Z][a-z]+:')
re.findall(char,sc101)
[A-Z][a-z]+: 정규식과 매치하여 리스트로 돌려준다. 즉, ' ~~: ' 형태의 문자열을 가진 부분들을 리스트의 요소들로!
■ set() : 리스트의 요소들 중 중복되는 값을 제거해준다
print(set(re.findall(char,sc101))) #set함수를 사용하면, 리스트 중에 중복값을 제거해준다
PART 02 클라우드 서버의 전자지갑으로, 파이썬과 SQL developer 연동
1단계) Anaconda prompt에서 아래와 같이 오라클 서비스를 이용할 수 있도록 설치한다
그러면 Solving environment가 실행되면서 쭉쭉 설치하게 됨
중간에 위와 같은 진행하겠습니까? 질문에 y를 입력해줌
뭔가 쭉쭉 설치되고 마지막에 위처럼 설치가 완료됨!
2단계) instantclient-basic-windows.x64-19.11.0.0.0dbru.zip 파일을 풀어놓는다
3단계) 생성된 클라우드 서버의 전자지갑 파일을 다운받아서, 압축을 풀어놓는다
4단계) SQL developer에서 나의 클라우드 지갑을 Oracle에 접속시켜준다
위의 정보들을 입력하고 맨 아래 '테스트'를 눌렀을 때, 상태 : 성공 이 뜨면 클라우드 서버에 접속 성공!
5단계) 파이썬 editor에서 다음과 같이 입력하여, SQL developer와 연동하고 테이블을 하나 생성해봅니다
import cx_Oracle
#
cx_Oracle.init_oracle_client(lib_dir=r"C:\oracle\instantclient_19_11")
#Oracle에 접속! => Connection Object를 생성
connection = cx_Oracle.connect(user='ora01', password='****', dsn='edudb_high')
#Connection Object에서 SQL문을 실행하기 위해서는 아래 함수로 Cursor Object를 생성!
cursor = connection.cursor()
#숫자 자료형인 id라는 컬럼, 문자 자료형인 data라는 컬럼을 갖고 있는 pytab이라는 테이블을 생성!
cursor.execute("create table pytab (id number, data varchar2(20))")
#만약 이미 pytab 테이블이 있었다면, 지워주자
#cursor.execute("drop table pytab purge")
#각각의 컬럼에 넣고 싶은 데이터
rows = [ (1, "First" ),
(2, "Second" ),
(3, "Third" ),
(4, "Fourth" ),
(5, "Fifth" ),
(6, "Sixth" ),
(7, "Seventh" ) ]
#위의 예시 데이터들을 테이블에 집어넣는다
cursor.executemany("insert into pytab(id, data) values (:1, :2)", rows)
#commit까지 완료해야 테이블이 진짜 생성됩니다
connection.commit()
SQL developer에서 아래와 같이 입력하고 실행해보면 테이블이 생성됐다!
