파이썬 - 정규표현식

    728x90

    정규 표현식

    메타문자

    메타 문자 사용예 설명
    [ ] 문자 클래스 [abc] a, b, c 중 한 개의 문자와 매치  
    [s-e]   [0-2]
    [a-c]
    [a-zA-Z]
    [0-9]
    0,1,2
    a,b,c
    알파벳모두
    숫자
    ^ 반대 [^0-9] 숫자가 아닌 문자와 매치
    ? 0또는1글자
    (있어도 되고 없어도 되고)
    ab?c ?앞에 문자 b를 0 또는 1번 반복
    O abc
    O ac
    X abbc
    . 1글자 a.b
    a[.]b
    a + 모든문자 + b
    a + Dot(.)문자 + b
    * 반복 0~ ca*t *앞에 문자 a를 0~ 반복
    O ct
    O cat
    O caaat
    + 반복 1~ ca+t +앞에 문자 a를 1~ 반복
    X ct
    O cat
    O caaat
    {s,e} 반복 s~e {3,5}
    {3, }
    { ,5}
    {1, }
    {0, }
    ca{2}t


    ca{2,4}t



    3이상 ~ 5이하 반복
    3~ 이상 반복
    ~5 이하 반복
    +
    *
    {2}앞에 문자a를 2번반복
    X cat
    O caat
    {2}앞에 문자a를 2 ~ 4번반복
    X cat
    O caat
    O caaaat
     
     
    ^…$    Starts and ends
    (…)    Capture Group
    (a(bc))    Capture Sub-group
    (.*)    Capture all
    (abc|def)    Matches abc or def

    자주 사용하는 문자 클래스

    종류 문자클래스 설명 유사표현
    숫자 \d 숫자와 매치 [0-9]
      \D 숫자가 아닌 것과 매치 [^0-9]
    숫자+문자 \w 문자+숫자(alphanumeric)와 매치 [a-zA-Z0-9_]
      \W 문자+숫자(alphanumeric)가 아닌 문자와 매치 [^a-zA-Z0-9_]
    특수문자 \s whitespace 문자와 매치 [ \t\n\r\f\v]
      \S whitespace 문자가 아닌 것과 매치 [^ \t\n\r\f\v]

     

    import re 정규식을 이용한 문자열 검색


    종류 설명
    match() 문자열의 처음부터 정규식과 매치되는지 검사 (처음부터 매치안되면 None)
    search() 문자열 전체에서 정규식과 매치되는지 검사
    findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 반환
    finditer() 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 반환
    import re
    • re.함수('패턴', '검색대상문자열')
    m = re.match('[a-z]+', "python")
    #'python'에서 a-z까지 값을 매치해라
    print(m)
    출력 값: <re.Match object; span=(0, 6), match='python'>
    #0부터6까지 자리의 값 'python'

     

    m = re.match('[a-z]+', "10python")
    print(m)
    출력 값: None #처음부터 매치X라 None

     

    • 패턴 '[a-z]+'를 매번 쓰기 귀찮다
    • 패턴 컴파일 -> [패턴변수.search("검색대상문자열")]
    p = re.compile('[a-z]+') #패턴 변수에 담기
    m = p.search("python") #패턴변수.search("검색대상문자열")
    print(m)
    
    m = p.search("3 python") #패턴변수.search("검색대상문자열")
    print(m)
    출력 값:
    <re.Match object; span=(0, 6), match='python'>
    <re.Match object; span=(2, 8), match='python'>
    • match()
      • 컴파일된 패턴 '[a-z]+'를 가지고 match() 메서드 수행
    m = re.match('ab*', "python") #a [b를 0부터 반복가능] ex) a, ab, abb, abbb
    print(m)
    
    m = re.match('[a-z]+', "python") #[a-z]+ -> 알파벳이 1개 이상 매치
    print(m, m.group())
    
    m = re.match('[a-z]+', "3 python")
    print(m)

     

    출력 값:
    None
    <re.Match object; span=(0, 6), match='python'> python
    None
    • search()
      • 컴파일된 패턴 객체 '[a-z]+'를 가지고 search() 메서드 수행
    p = re.compile('[a-z]+') #패턴 담아두기
    m = p.search("3 python") #패턴.search('검색대상문자열')
    print(m)
    출력 값:
    <re.Match object; span=(2, 8), match='python'>
    • findall()
      • 컴파일된 패턴 객체 '[a-z]+'를 가지고 findall() 메서드 수행 - 정규식과 매치되는 리스트 반환
    p = re.compile('[a-z]+') #패턴 담아두기
    m = p.findall("3 life is 100 too short 100")
    print(m)
    출력 값:
    ['life', 'is', 'too', 'short']
    • finditer()
      • 컴파일된 패턴 객체 '[a-z]+'를 가지고 finditer() 메서드 수행 - 정규식과 매치되는 iterator 객체 반환
      • 따로 객체를 for문 돌려서 출력해줘야함
    m = p.finditer("a b cde 100")
    print(m)
    for match_obj in m: 
        print(match_obj, '\t', match_obj.group())
    출력 값:
    <callable_iterator object at 0x00000127DBB9D1C0>
    <re.Match object; span=(0, 1), match='a'> 	 a
    <re.Match object; span=(2, 3), match='b'> 	 b
    <re.Match object; span=(4, 7), match='cde'> 	 cde

    Quiz

    (1)정규식 a[.]{3,}b과 매치되는 문자열?

    acccb
    a....b
    aaab
    a.cccb
     

    (2)다음은 무엇을 표현하기 위한 정규식인가?
    ".*[@].*[.].*$" 

    >>> 이메일


    r"(\w+)\s+\d+[-]\d+[-]\d+"

    >>>이름, 전화번호
     
    (3) 확장자 txt만 찾기
    m = re.findall("\w*[.]txt", "abc.txt abc.jpg a100.txt")
    print(m)
     

    (4) 한글 이름만 찾기

    m = re.findall(f"[^a-zA-Z\s]+", "James 홍길동 아무개")
    print(m)
    
    m = re.findall("[가-힣]+", "James 홍길동 아무개")
    print(m)

     

    'Python > 문법' 카테고리의 다른 글

    파이썬 - 함수 중급  (0) 2022.01.10
    파이썬 - 자료형 심화  (1) 2022.01.09
    파이썬 - enumerate 함수  (0) 2022.01.04
    파이썬 - 예외 처리  (0) 2022.01.03
    파이썬 - 모듈  (0) 2021.12.31

    댓글