기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

정규표현식(Regular Expression)

내용

정규식(Regular Expression, RE)

python 주요 메소드와 주요 함수

정규식은 특정한 패턴을 가진 문자열을 표현하기 위한 표현식(expression)으로 특정 규칙의 텍스트를 검색하거나 치환하기 위해 사용합니다. 즉, 여러개의 문자를 표현하거나 패턴을 찾기 위한 특수한 심벌들과 문자들을 이용하는 문자열입니다. 정규표현식은 간단히 정규식 또는 regex로 나타냅니다.

python 라이브러리 re 모듈을 사용합니다. 패턴과 검색할 문자열은 유니코드 문자열과 8 bit 문자열이 될 수 있습니다. 그러나 상호간의 검색과 패턴을 검사할 수 없습니다. 즉, 치환 또는 검색문자(열)와 대상 문자열은 동일한 형이어야 합니다.

모듈 re에서 일치하는 문자열을 찾기 위한 기본적인 메소드들은 다음과 같습니다.

메소드 내용
obj=re.compile(x) 검색할 대상인 x를 정규식 객체로 변환합니다. 즉, 파이썬 인식할 수 있는 개체로 인코딩합니다.
obj.search(y) 검색할 대상인 x를 y에서 검색합니다. 최초로 매칭된 결과만을 객체의 인덱스 구간과 문자를 반환
obj.findall(y) 검색할 대상인 x를 y에서 검색합니다. 매칭된 모든 결과를 리스트 형식으로 반환
결과.group() search()등의 메서드를 적용한 결과 중 매칭된 문자만을 반환하기 위해 사용
import re
txt="""행복을 추구하는 우리 삶의 많은 부분은 경제적 의사결정과 밀접하게
        관련되어 있습니다. 우리는 일상생활에서 의사결정을 계속하지 않을 수 없
        습니다. """ 
trg=re.compile("결정") 
result=trg.search(txt)
result
<re.Match object; span=(28, 30), match='결정'>
result.group()
'결정'
trg.findall(txt)
['결정', '결정']

위의 기본적인 메소드는 함수와 동일한 이름을 갖습니다. 다음은 정규식을 사용할 수 있는 다양한 함수들입니다.

함수 내용
compile(pattern) 주어진 pattern을 컴파일 하여 정규식 객체를 반환
match(pattern, string) 주어진 string의 시작부분에 해당 pattern이 존재하는지 검사하여 매치되는 객체를 반환
search(pattern, string) 주어진 string의 전체부분에 해당 pattern이 존재하는지 검사하여 처음으로 매치되는 부분을 반환
split(pattern, string) 주어진 pattern을 기준으로 string을 분리하여 리스트로 반환
findall(pattern, string) 주어진 string에서 pattern을 만족하는 문자열을 찾아 리스트로 반환
sub(pattern, repl, string) string에서 pattern 부분을 repl로 대체하여 문자열을 반환
subn(pattern, repl, string) sub() 함수와 동일 하지만 결과로 (결과문자열, 매칭횟수)를 튜플로 반환
escape(string) 영문자나 숫자를 제외한 문자들을 백슬러시로 지정해서 리턴
txt="The beautiful sky in october"
x=re.search("e", txt)
x
<re.Match object; span=(2, 3), match='e'>
re.match("e", txt)
print(re.match("e", txt))
None
re.match("T", txt)
<re.Match object; span=(0, 1), match='T'>
re.split("e", txt)
['Th', ' b', 'autiful sky in octob', 'r']
re.findall("e", txt)
['e', 'e', 'e']
re.sub("e", '0', txt)
'Th0 b0autiful sky in octob0r'
re.subn("e", '0', txt)
('Th0 b0autiful sky in octob0r', 3)
re.escape(txt)
'The\\ beautiful\\ sky\\ in\\ october'

정규식의 기호

대상이 되는 문자열의 검색을 위해 문자(열)에 일정한 규칙(패턴)을 지정합니다. 기본적으로 정규식에서는 대소문자를 구분하고 빈칸을 인식합니다.

text="Hello, hello, World"
regex=re.compile("Hello")
regex.findall(text)
['Hello']
txt="경제적으로 윤택한 것도 행 복한 삶의 여러가지 조건 중 하나"
re.search("행복", txt)
re.search("행 복", txt)
<re.Match object; span=(13, 16), match='행 복'>

그 외에 여러가지 형태의 패턴을 인식하기 위해 사용하는 다양한 기호들이 존재합니다.

정규식 설명
. 임의의 한 문자가 존재
? ? 앞의 문자(열) 중 존재하는 문자 검색
* * 앞의 문자(열)가 존재여부 예) abc* → abc 또는 ab 또는 a 검색
+ 바로 앞의 문자(열)의 존재를 검색 예) abc+ → abc 검색
^ 바로 뒤의 문자로 문자열이 시작 예) ^x: 검색하는 전체 대상이 x로 시작
$ 바로 앞의 문자로 문자열이 끝남 예)x$: 검색하는 전체 대상이 x로 끝남
문자(열){숫자} 문자(열)이 숫자만큼 반복
문자(열){숫자,} 문자(열)이 숫자 이상 만큼 반복
문자(열){숫자1, 숫자2} 문자(열)이 숫자1 이상, 숫자 2 이하만큼 반복
(문자열) 문자나 문자열을 묶음
문자(열)1 | 문자(열)2 문자(열)1 이나 문자(열)2를 검색
[문자1, 문자2, ...] 대괄호 안의 문자들이 존재하는지 검색
[^] '^' 기호 바로 뒤의 문자가 존재하지 않음
[:alpha:] 알파벳만 검색
[:alnum:] 알파벳, 숫자 검색
[:digit:] 숫자만 검색
[:upper:] 대문자만 검색
\ (역슬래시) 글자 자체를 검색
\d 모든 숫자를 검색, [0-9]와 동일
\D 숫자를 제외한 모든 문자를 검색 [^0-9]
\s 공백을 검색
\S 공백이 아닌 문자를 검색
\A문자(열) 대상이 문자(열) 시작
\w 숫자 또는 문자를 검색 [a-zA-Z0-9]
\W 숫자 또는 문자가 아닌 것을 검색
\Z 지정된 문자로 끝나면 그 문자를 반환
\b문자 지정된 문자가 단어의 시작 또는 끝에 있는 존재여부를 검색
\B문자 지정된 문자가 문자열의 시작과 끝이 아닌 위치에 있는 경우 반환
.
임의의 한 문자
import re
r=re.compile("a.c") #.은 임의의 한문자 
r.search("avc") #a와 c사이에 한개의 문자 존재
<re.Match object; span=(0, 3), match='avc'>
?
기호 앞의 문자가 존재여부에 관계없이 기호 뒤의 문자는 반드시 존재해야 됨
r.search('ac')#a와 c사이에 문자가 존재하지 않으므로 결과없음 
txt="hello world"
re.search("h.", txt) #h 다음에 임의의 한 문자
<re.Match object; span=(0, 2), match='he'>
re.search("h..", txt) #h 다음에 임의의 두 문자 
<re.Match object; span=(0, 3), match='hel'>
txt="Sensibility of October's clear sky and rainy sky "
re.findall("[clear]", txt)#대괄호내의 각 문자를 검색
['e', 'l', 'c', 'e', 'r', 'c', 'l', 'e', 'a', 'r', 'a', 'r', 'a']
re.findall("clear", txt) #=re.findall("(clear)", txt) 문자열을 검색
['clear']
txt = "symbols for start and end"
re.findall('^sy', txt) #sy로 시작되는 문자를 지정함 
['sy']
r=re.compile("d$")
r.search(txt) #검색 대상이 'd'로 끝남
<re.Match object; span=(24, 25), match='d'>
txt = "The rain in Spain falls mainly in a pln!"
re.search('ai+', txt) #+ 앞에 검색 대상 문자
<re.Match object; span=(5, 7), match='ai'>
re.findall('ai+', txt)
['ai', 'ai', 'ai']
re.findall('aix+', txt)
[]
re.findall('aix?', txt)
['ai', 'ai', 'ai']
re.findall('aix*', txt)
['ai', 'ai', 'ai']
txt = "The rain in Spain falls mainly in the plain!"
re.findall('al{2}', txt)
['all']
re.findall('a{2}', txt)
[]
txt="Sensibility of October's clear sky and rainy sky "
re.findall("clear|cloudy", txt)
['clear']
txt = "59 dollars" #모든 숫자 
re.findall('\d', txt)
['5', '9']
txt = "59 dollars" #숫자를 제외한 모든 문자
re.findall('\D', txt)
[' ', 'd', 'o', 'l', 'l', 'a', 'r', 's']
re.findall('\s', txt) #공백검색
[' ']
re.findall('\S', txt) #공백이 아닌 문자, 숫자 검색
['5', '9', 'd', 'o', 'l', 'l', 'a', 'r', 's']
txt="hello world_20"
re.findall("\w", txt)
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_', '2', '0']
re.findall("\W", txt)
[' ']

백스페이스(\)는 다음에 오는 문자 자체를 검색합니다. \문자를 검색에서 제외하기 위해서는 "\\문자 검색대상" 또는 r"\문자검색대상"과 같이 실행합니다. 이 경우 r은 "raw string(원시문자열)"을 의미합니다. 다음 코드에서 \b가 단순히 문자 b가 아니고 정규식 코드임을 나타내기 위해 r"\b--" 또는 "\\b--"의 형식으로 코드를 구성합니다.

txt="Sensibility of October's clear sky and rainy sky "
re.findall(r"\bSen", txt)
['Sen']
re.findall("\\bSen", txt)
['Sen']
re.findall("\bSen", txt)
[]
re.findall(r"ky\b", txt)
['ky', 'ky']
re.findall("\\Bto", txt)
['to']
re.findall(r"\Bto", txt)
['to']

'\'기호를 탈출문자(escape character)라고 하는데 이는 문자의 원래의 의미를 없애고 단지 문자열의 한 요소로 취급하기 때문입니다. 빈번히 사용되는 escape character는 다음과 같습니다.

Escape character 설명
\n 줄바꿈(개행)
\v 수직탭
\t 수평탭
\r 캐리지리턴
\f 폼 피드
\a 벨 소리
\b 벨 소리
\000 널문자
\ 문자 " "
' 단일 인용부호(')
" 이중 인용부호(")

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b