반응형
+ Regular Expression
import re
re.sub('ROAD$', 'RD.', s) ; 스트링 s에서 ROAD로 끝나는 것을 'RD.'으로 바꿔라.
\b 는 word boundary를 의미.
실제 사용할 때는 \도 escape처리해 줘야 되서 \\b로 써야 한다.
-> 복잡하기 때문에 raw type을 사용. 앞에 r을 붙임.
re.sub(r'\bROAD\b', 'RD.', s) ; 단어로 ROAD 자체를 쓰는 경우만 치환.
-전화번호 분할
800-555-1234
phonePattern = re.compile( r'^(\d{3})-(\d{3})-(\d{4})$' )
phonePattern.search( '800-555-1234').groups()
( '800', '555', '1234')
phonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')
시작 , 그룹1:숫자3개 , 비숫자0개이상, 그룹2:숫자3개, 비숫자0개이상,
그룹3:숫자0개이상, 끝
num=80055512121234
phonePattern.search(num).groups()
800 555 1212 1234
800-555-1212
phonePattern = re.compile(r'''
# don't match beginning of string, number can start anywhere
(\d{3}) # area code 3digits. 시작문자제거. 숫자는 나중에 올수 있음.
\D* # optional
(\d{3})
\D* # optional
(\d{4})
\D* # optional
(\d*) # optional number
$ # end
'''
phonePattern.search('work 1-(800) 555.1212 #1234').groups()
800 555 1212 1234
phonePattern.search('800-555-1212).groups()
800 555 1212 ''
^ ; start
$ ; end
\b ; word boundary ; \bWORK\b
\d ; digit
\D ; not digit
x? ; optional x (0개 또는 1개)
x* ; 0개 이상
x+ ; 1개 이상
x{n,m} ; n개이상 m개 이하. n~m개
(a|b|cd) ; 셋 중 하나 a or b or cd
[abcd] ; 안에 있는 캐럭터중에 하나. a or b or c or d
[^abcd] ; 안에 있는 캐릭터가 다 아닌 것. []안에 ^는 not이다!
(x) ; group
\1, \2, \3 .. ; group 번호
ex) s, x, z로 끝나면 es를 붙인다.
if re.search('[sxz]$', noun):
return re.sub('$', 'es', noun)
ex) 단어에 a,b,c 중 하나가 들어있냐?
re.search('[abc]', 'Mark') => yes. object return. not null
ex) a,b,c가 있으면 o로 바꾼다.
re.sub('[abc]', 'o', 'caps') => oops
ex) aeiou가 아닌 글자 다음에 y로 끝나면, y를 ies로 바꾼다.
if re.search('[^aeiou]y$', noun) :
return re.sub('y$', 'ies', noun)
or
if re.search('[^aeiou]y$', noun) :
return re.sub('([^aeiou])y$', r'\1ies', noun)
+ 함수도 객체. 여러 조건에 따라 각각 하는 일이 다른 경우. 한 번에 처리!
import re
def match_sxz(noun):
return re.search('[sxz]$', noun)
def apply_sxz(noun):
return re.sub('$', 'es', noun)
def match_h(noun):
return re.search('[^aeioudgkprt]h$', noun)
def apply_h(noun):
return re.sub('$', 'es', noun)
def match_y(noun):
return re.search('[^aeiou]y$', noun)
def apply_y(noun):
return re.sub('y$', 'ies', noun)
def match_default(noun):
return True
def apply_default(noun):
return noun+'s'
rules=( (match_sxz, apply_sxz), (match_h, apply_h), (match_y, apply_y), (match_default, apply_default))
def plural(noun):
for match_x, apply_x in rules:
if match_x(noun):
return apply_x(noun)
다른 방법? ; 위 함수들을 자동으로 만든다.
def build_match_and_apply_functions(pattern, search, replace):
def matches_rule(word):
return re.search(pattern, word)
def apply_rule(word):
return re.sub(search, replace, word)
return (matches_rule, apply_rule)
patterns=\
(
('[sxz$]', '$', 'es'),
('[^aeioudgkprt]h$', '$', 'es'),
('(qu|[^aeiou])y$', 'y$', 'ies'),
('$', '$', 's')
)
rules = [ build_match_and_apply_functions( pattern, search, replace )
for (pattern, search, replace) in patterns ]
'Python' 카테고리의 다른 글
Python 강좌6 tuple, set, dictionary (0) | 2018.03.21 |
---|---|
Python 강좌5 List (0) | 2018.03.20 |
Python 강좌3 자료형. 수/문자열 (1) | 2018.03.16 |
Python 강좌2 if/for/while/function (0) | 2018.03.15 |
Python 강좌1. 산술연산, range (0) | 2018.03.14 |