기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

정규표현식(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' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...