반응형



+ 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

+ Recent posts