7.1.3 정규표현식

import re
result = re.match('You', 'Young Frankenstein')

‘You’는 패턴이고 ‘Young Frankenstein’은 확인하고자 하는 문자열 소스다. mathch()는 소스와 패턴의 일치 여부를 확인한다.

youpattern = re.compile('You')
result = youpattern.match('Young Frankenstein')
result

<_sre.SRE_Match object; span=(0, 3), match=’You’>

  • search()는 첫 번째 일치하는 객체를 반환한다.
  • findall()은 중첩에 상관없이 모두 일치하는 문자열 리스트를 반환한다.
  • split()은 패턴에 맞게 소스를 쪼갠 후 문자열 조각의 리스트를 반환한다.
  • sub()는 대체 인자를 하나 더 받아서, 패턴과 일치하는 모든 소스 부분을 대체 인자로 변경한다.

    시작부터 일치하는 패턴 찾기: match()

    def printm(m):
    if m:
    print(m.group())
    source = 'Young Frankenstein'
    m = re.match('You', source) # match는 소스의 시작부터 패턴이 일치하는지 확인.
    if m: # match는 객체를 반환한ㄷ.
    print(m.group())
    

    You

    m = re.match('^You', source)
    if m:
    print(m.group())
    

    You

    m = re.match('Frank', source)
    if m:
    print(m.group())
    
    m = re.search('Frank', source)
    if m:
    print(m.group())
    

    Frank

    m = re.match('.*Frank', source)
    printm(m)
    

    Young Frank

  • .은 한문자를 의미한다.
  • *는 이전패턴이 여러개 올 수 있다는 것을 의미한다. 그러므로 .*는 0회 이상의 문자가 올 수 있다는 것을 의미한다.
  • Frank는 포함되어야 할 문구를 의미한다.
    m = re.search('.*Frank', source)
    printm(m)
    

    Young Frank

    일치하는 모든 패턴 찾기: findall()

    m = re.findall('n', source)
    m
    

    [‘n’, ‘n’, ‘n’, ‘n’]

    print('Found', len(m), 'matches')
    

    Found 4 matches

    m = re.findall('n.', source)
    m
    

    [‘ng’, ‘nk’, ‘ns’]

    m = re.findall('n.?', source)
    m
    

    [‘ng’, ‘nk’, ‘ns’, ‘n’]

    패턴으로 나누기: split()

    m = re.split('n', source)
    m
    

    [‘You’, ‘g Fra’, ‘ke’, ‘stei’, ‘’]

    일치하는 패턴 대체하기: sub()

    m = re.sub('n', '?', source)
    m
    

    ‘You?g Fra?ke?stei?’

    패턴: 특수 문자

  • 리터럴은 모든 비특수 문자와 일치한다.
  • \n을 제외한 하나의 문자: .
  • 0회 이상: *
  • 0 또는 1회: ?
    import string
    printable = string.printable
    len(printable)
    

    100

    printable[0:50]
    

    ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN’

    printable[50:]
    

    ‘OPQRSTUVWXYZ!”#$%&'()*+,-./:;<=>?@[\]^_`{|}~ \t\n\r\x0b\x0c’

    m = re.findall('\d', printable)
    m
    

    [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]

    m = re.findall('\w', printable)
    print(m)
    

    [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’, ‘_’]

    re.findall('\s', printable)
    

    [’ ‘, ‘\t’, ‘\n’, ‘\r’, ‘\x0b’, ‘\x0c’]

    x = 'abc' + '-/*' + '\u00ea' + '\u0115'
    
    x
    

    ‘abc-/*êĕ’

    re.findall('\w', x)
    

    [‘a’, ‘b’, ‘c’, ‘ê’, ‘ĕ’]

    패턴: 지정지

    source = '''I wish I may, I wish I might
    Have a dish of fish tonight.'''
    
    re.findall('wish', source)
    

    [‘wish’, ‘wish’]

    re.findall('wish|fish', source)
    

    [‘wish’, ‘wish’, ‘fish’]

    re.findall('^wish', source)
    

    []

    re.findall('^I wish', source)
    

    [‘I wish’]

    re.findall('fish$', source)
    

    []

    re.findall('fish tonight\.$', source)
    

    [‘fish tonight.’]

    re.findall('[wf]ish', source)
    

    [‘wish’, ‘wish’, ‘fish’]

    re.findall('[wsh]+', source)
    

    [‘w’, ‘sh’, ‘w’, ‘sh’, ‘h’, ‘sh’, ‘sh’, ‘h’]

    re.findall('ght\W', source)
    

    [‘ght\n’, ‘ght.’]

    re.findall('I (?=wish)', source)
    

    [‘I ‘, ‘I ‘]

    re.findall('(?<=I) wish', source)
    

    [’ wish’, ‘ wish’]

    re.findall(r'\bfish', source)
    

    [‘fish’]

    패턴: 매칭 결과 지정하기

  • match() 또는 search()를 사용할 떄 모든 매칭은 m.gorup()과 같이 객체 m으로 부터 결과를 반환한다.
    import re
    m = re.search(r'( dish\b).*(\bfish)', source)
    
    m.group()
    

    ’ dish of fish’

    m.groups()
    

    (‘ dish’, ‘fish’)

    m.group(2)
    

    ‘fish’

    m = re.search(r'(?P<DISH>. dish\b).*(?P<FISH>\bfish)', source)
    
    m.group()
    

    ‘a dish of fish’

    m.groups()
    

    (‘a dish’, ‘fish’)

    m.group('DISH')
    

    ‘a dish’

    m.group('FISH')
    

    ‘fish’

Comments