ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] Regular Expression(정규표현식) #Step1
    파이썬 2021. 10. 23. 00:16
    728x90

    💢정규표현식Regular expression) #step1


    정규표현식이란??

    • 복잡한 문자열을 처리할 때 사용하는 기법으로, 파이썬만의 문법이 아니라 문자열을 처리하는 모든 곳에서 사용한다. 밑에서 정규표현식이 왜 필요한지 살펴 보도록 하자!

    ❓왜 정규 표현식을 사용할까?

    예를 들어 주민등록번호 번호 형태(ex)111111-1111111))로 있을때 보안상 뒤에있는 7자리를 *로 처리하고 싶을 때를 생각해보자. 정규 표현식을 모를 경우 아래와 같이 구현을 해야 한다.

    📜일반적 코드

    data = """
    park 111111-1111111
    kim  222222-2222222
    """
    
    result = []
    for line in data.split("\n"):
        word_result = []
        for word in line.split(" "):
            if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
                word = word[:6] + "-" + "*******"
            word_result.append(word)
        result.append(" ".join(word_result))
    print("\n".join(result))

    📄출력값

    park 111111-*******
    kim  222222-*******

    정규식을 모를 경우 저렇게 긴 코드를 작성해야 하지만 알 경우 훨씬 간편하게 구현을 할 수 있다 아래와 같은 코드를 봐보도록 하자

    📜정규표현식 코드

    import re #정규표현식 라이브러리 호출
    
    data = """
    park 111111-*******
    kim  222222-*******
    """
    
    pat = re.compile("(\d{6})[-]\d{7}")
    print(pat.sub("\g<1>-*******", data))

    📄출력값

    park 111111-*******
    kim  222222-*******

    그럼이제 정규표현식에는 어떤 문자들을 사용해 내가 원하는 형태로 만들고 바꿀 수 있는지 알아보도록 하자

    🔑자주사용되는 문자


    의미 내용
    . 임의의 한문자를 의미
    ? 문자가 존재하거나 존재하지 않음(0,1)
    * 문자가 미존재 또는 무한대로 존재(0~)
    + 문자가 한번 이상 무조건 존재(1~*)
    ^ 기호 바로 뒤의 문자로 문자열이 시작
    $ 기호 바로 앞의 문자로 문자열이 끝남
    {m} m만큼 반복
    {m, n} m~n만큼 반복 가능
    \\ 역슬래쉬ㅜ 글자 자체를 검색
    \d 모든 숫자를 검색, [0-9]와 동일
    \D [^0-9]와 동일, 숫자를 제외한 모든 문자를 검색
    \s 공백을 검색(space)
    \S 공백이 아닌 문자를 검색
    \w 숫자 또는 문자를 검색[a-zA-Z0-9] word를 표현하며
    \W 알파벳, 숫자가 아닌 문자를 의미[^a-zA-Z0-9]
    \b 문자와 공백 사이의 문자를 의미
    \B 문자와 공백 사이가 아닌 문자를 의미
    \d digit의 약자로 숫자를 의미
    \D non digit를 표현하며 숫자가 아닌 것을 의미

    위 테이블의 문자열들이 어떤 역할을 하는지 인지한 상태에서 코드로 어떻게 구현되는지 확인해 보도록 하자.

    정규식과 문자열 매치여부 확인연습

    ✅Dot(.)
    a.b
    위 정규식 의미는 "a + 모든 문자 + b"라고 이해를 하면 된다
    즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다.

    정규식 문자열 Match 여부 설명
    a.b aab Yes a와 b 사이에 문자열이 존재
    a.b a0b Yes a와 b 사이에 문자열이 존재
    a.b abc Yes a와 b 사이에 문자열이 존재X

    .를 임의의 문자로 인식하는게 아니라 .그대로를 의미하고 싶을때 a[.]b 사용


    ✅반복(*)

    *는 앞에 문자가 0번부터 무한대까지 반복을 의미하므로 앞에 문자가 있어도 없어도 크게 상관없다.

    정규식 문자열 Match 여부 설명
    ca*r cr Yes "a가 0번 반복되어 매치"
    ca*r car Yes a가 1번 반복되어 매치
    ca*r caaar Yes a가 3번 반복되어 매치

    ✅반복(+)

    +는 앞에 문자가 최소 1번부터 무한대까지 반복을 의미한다.

    정규식 문자열 Match 여부 설명
    ca*r cr No "a가 0번 반복되어 매치X"
    ca*r car Yes a가 1번 반복되어 매치
    ca*r caaar Yes a가 3번 반복되어 매치

    ✅반복({m,n})
    {}안에 숫자가 하나면 무조건 그 수만큼 반복을 해야하고 m, n으로 주어지면 그 사이 안에서 반복해야 함을 의미한다.

    ✅m만 있을 경우

    정규식 문자열 Match 여부 설명
    ca{2}r car No "a가 1번 반복되어 매치X"
    ca{2}r caar Yes a가 2번 반복되어 매치

    ✅m, n이 주어질 경우

    정규식 문자열 Match 여부 설명
    ca{2,5}r car No "a가 1번 반복되어 매치X"
    ca{2,5} caar Yes a가 2번 반복되어 매치
    ca{2,5} caaaaar Yes a가 5번 반복되어 매치

    ✅임의의 한문자(?)
    ?는 0혹은 1을 의미

    정규식 문자열 Match 여부 설명
    a? a Yes "a가 1번 있으므로 매치"
    a? b Yes a가 0번이지만 매치

    ✅특정문자 범위(^)
    ^[]일 경우: 기호뒤에 있는 문자열로 시작해야 함을 의미
    [^]일 경우: 기호뒤에 있는 문자열로 시작하면 안됨을 의미

    정규식 문자열 Match 여부 설명
    ^[A-Z] Hello Yes 대문자로 시작했으므로 매치
    ^[A-Z] hEllo No 소문자로 시작했으므로 매치X
    [^A-Z] Hello No 소문자로 시작했으므로 매치X
    [^A-Z] hEllo Yes 소문자로 시작했으므로 매치

    ✅특점 범위로 끝나는지 여부($)

    특정 문자(숫자) 범위로 끝나느지 여부 판단하기 위해 사용
    1.[범위]$2.[범위]+$식으로 사용

    정규식 문자열 Match 여부 설명
    [0-9]+ test01 Yes 숫자가 포함되어 있으므로 매치"
    [0-9]+ t13est01 Yes 숫자가 포함되어 있으므로 매치"
    [0-9]+ 2tes05t Yes 숫자가 포함되어 있으므로 매치"
    [0-9]+$ test01 Yes 숫자로 끝이 났으므로 매치"
    [0-9]+$ t13est0 Yes 숫자로 끝이 났으므로 매치"
    [0-9]+$ 2test No 숫자로 끝이 나지 않았으므로 매치X"
    ___

    ✅특수 문자 판단하기

    • 정규표현식에 사용하는 특수문자(*, +, ?, .,^, $, (,), [,], -) 등을 판단하려면 특수 문자를 판단할 때는 특수 문자 앞에/ 표현

    📜코드

    # * : 0~ 무한대의 반복 횟수
    # \* : * 표현의 데이터를 의미
    
    # * 표현이 한번 이상 무한대 포함 되어야만 유효한 문자열로 검증
    print(re.search('\*+', 'aa'))  # None
    print(re.search('\*+', 'a*a'))
    print(re.search('\*+', 'a***a'))
    print(re.search('\*+', 'a'))   # None
    print(re.search('\*+', '**'))

    📄결과값

    None
    <re.Match object; span=(1, 2), match='*'>
    <re.Match object; span=(1, 4), match='***'>
    None
    <re.Match object; span=(0, 2), match='**'>

    ✅띄어쓰기 구분하기( \b / \B )

    • \b: 단어 구분이다면 보통 whitespace에 의해 구분된다.
    >>> p = re.compile(r'\bclass\b')
    >>> print(p.search('no class at all'))  
    <re.Match object; span=(3, 8), match='class'>

    위에 상황을 보면 class를 기준으로 앞뒤에 공백에 있는 것이 \bclass\b와 일치하므로 매치가 될 수 있다.

    반면에 아래와 같은 경우는 앞뒤에 무언가 붙어있으므로 매치가 될 수 없다.

    >>> print(p.search('the declassified algorithm'))
    None
    
    >>> print(p.search('one subclass is'))
    None
    • \B: \b와 반대되는 경우로 whitespace로 구분된 단어가 아닌 경우에 매치된다.
    >>> p = re.compile(r'\Bclass\B')
    >>> print(p.search('no class at all'))  
    None
    >>> print(p.search('the declassified algorithm'))
    <re.Match object; span=(6, 11), match='class'>
    >>> print(p.search('one subclass is'))
    None

    \B같은 경우에 앞뒤에 한곳이라 whitespace가 존재할 경우 매치가 안되는 것을 알 수 있다.

    *참고 사이트 및 교재: 점프투 파이썬
    영상 : (https://www.youtube.com/watch?v=dTDoTR0MXjU&list=RDCMUCQNE2JmbasNYbjGAcuBiRRg&start_radio=1&rv=dTDoTR0MXjU&t=4)
    참고자료: https://wikidocs.net/4309

    '파이썬' 카테고리의 다른 글

    [python]정렬 알고리즘  (0) 2021.10.23
    [python] Regular Expression(정규표현식) #Step2  (0) 2021.10.23
    파이썬 기초7,Quiz  (0) 2021.07.19
    파이썬 class_예제문제  (0) 2021.07.18
    파이썬 기초6  (0) 2021.07.18

    댓글

Designed by Tistory.