ABOUT ME

-

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

    정규표현식Regular expression) #step2


    💢자주사용되는 문자

    의미 내용
    . 임의의 한문자를 의미
    ? 문자가 존재하거나 존재하지 않음(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를 표현하며 숫자가 아닌 것을 의미

    💢패턴에 매칭되는 모든 문자열 가져오기

    • search() - 문서 내부(포함)의 패턴에 해당하는 첫번째 데이터 검색
    • findall() - 문서 내부에 패턴에 해당하는 모든 데이터를 list 타입
    • sub('패턴', '변경문자열', '문자열', 변경횟수) : 패턴과 일치되는 부분을 다른 문자로 변경
    • split() : 주어진 문자열을 특정 패턴을 기준으로 분리

    search()

    코드

    #? encore 9234 playdata 2345 .. 
    # 2로 시작하는 4자리 문자 포함 여부 검증
    
    data = re.search('2\d{3}', 'encore 9234 2222 playdata 2345 ..')
    print(data)

    결과값

    <re.Match object; span=(12, 16), match='2222'>

    search()는 2로 시작하는 4자리 숫자중 가장 앞에 있는 2222를 검색한다.


    findall()

    ➰코드

    import re
    data = re.findall('2\d{3}', 'encore 9234 playdata 2345 ..gwg 2456')
    print(data)
    print(type(data))  # <class 'list'>

    ➰결과값

    ['2345', '2456']
    <class 'list'>

    findall은 조건에 해당하는 모든 것들을 리스트에 담아주는 역할을 수행한다. 타입을 찍어봤을때 list인것을 확인할 수 있다.

    심화적용

    파일안에 있는 글들은 읽고 데이터로 쭉 뽑아와 그안에서 내가 뽑고자 하는 것들을 뽑아보도록 하자

    • dataSet/poem.txt 파일 내부의 데이터 중에서 "내가" 단어 존재여부 list로 만들기

    ➰코드

    datas = []
    with open('dataSet/poem.txt', 'r', encoding='utf-8') as f:
        datas = f.read() 
    
    print(datas)
    
    data = re.findall("내가", datas)
    print(data, "내가 개수 :" , len(data))

    ➰결과값

    (datas 라는 list 출력값)

    내 속엔 내가 너무도 많아 당신의 쉴 곳 없네
    내 속엔 헛된바램들로 당신의 편할 곳 없네
    내 속엔 내가 어쩔 수 없는 어둠 당신의 쉴 자리를 뺏고
    내 속엔 내가 이길 수 없는 슬픔 무성한 가시나무숲같네

    바람만 불면 그 메마른가지 서로 부대끼며 울어대고
    쉴곳을 찾아 지쳐 날아온 어린새들도 가시에 찔려 날아가고
    바람만 불면 외롭고 또 괴로워 슬픈 노래를 부르던 날이 많았는데

    내 속엔 내가 너무도 많아서 당신의 쉴 곳 없네

    바람만 불면 그 메마른가지 서로 부대끼며 울어대고
    쉴곳을 찾아 지쳐 날아온 어린새들도 가시에 찔려 날아가고
    바람만 불면 외롭고 또 괴로워 슬픈 노래를 부르던 날이 많았는데

    내 속엔 내가 너무도 많아서 당신의 쉴 곳 없네

    data출력값

    ['내가', '내가', '내가', '내가', '내가'] 내가 개수 : 5

    ✅split()

    ➰코드

    data = re.split('2\d{3}', 'encore 9234 playdata 2345 data 2456 test')
    print(data)
    print(type(data)) 

    ➰결과값

    ['encore 9234 playdata ', ' data ', ' test']
    <class 'list'>

    split()은 정규표현식에 해당하는 것들은 기준으로 데이터들을 쪼개서 list화 시켜주는다는 것을 알 수 있다.
    2로 시작하는 4자리 숫자들을 기준으로 데이터들이 쪼개져 list타입의 data가 뽑힌것을 알 수 있다.


    ✅sub()

    sub('정규표현식', '바꾸고자 하는 형태', 바꾸고자 하는 데이터)

    ➰코드

    data = re.sub('2\d{3}', '100', 'encore 9234 playdata 2345 data 2456 test')
    print(data)
    
    data = re.sub( '[0-9]', 'n', 'encore 9234 playdata 2345 data 26 test')
    print(data)
    
    data = re.sub( 'apple | orange', '과일', 'apple 9234 orange 2345 data 26 test')
    print(data)

    ➰결과값

    encore 9234 playdata 100 data 100 test
    
    encore nnnn playdata nnnn data nn test
    
    과일9234과일 2345 data 26 test

    ➰sub() 적용 단계

    • 첫 번째 파라미터에 적용시키고자하는 정규표현식 작성
    • 두 번째 파라미터에 내가 바꾸고자 하는 형태를 작성
    • 세 번째 파라미터에 바꾸고자 하는데이터 기입

    그루핑

    abc를 반복 시키고 싶은 경우가 있다고 하자. abc+ 이렇게 할경우 +의 효과가 c의만 적용되게 된다. 이럴때 ()를 사용하여 abc를 (abc)+형태로 그룹화 시켜주면 된다.

    ➰코드

    >>> p = re.compile('(abc)+')
    >>> m = p.search('abcabcabc OK?')
    >>> print(m)
    <re.Match object; span=(0, 9), match='abcabcabc'>
    >>> print(m.group())
    abcabcabc

    다음예를 보자

    ➰코드

    >>> p = re.compile(r"\w+\s+\d+[-]\d+[-]\d+")
    >>> m = p.search("park 010-1234-1234")

    위에는 이름 + " " + 전화번호 형태의 문자열을 찾는 규칙이다.
    이름만 뽑아개고 싶을때 아래와 같이 할 수 있다.

    ➰코드

    >>> p = re.compile(r"(\w+)\s+\d+[-]\d+[-]\d+")
    >>> m = p.search("park 010-1234-1234")
    >>> print(m.group(1))
    park

    \w+ 부분을 (\w+)로 그룹화 시킨후 첫번째로 그룹화 된 부분이기 때문에 group(1)을 하면 이름 부분만 뽑아 올 수 있다.

    group(인덱스) 설명
    group(0) 매치된 전체 문자열
    group(1) 첫번째 매치된 전체 문자열
    group(2) 두번째 매치된 전체 문자열
    group(n) 매치된 전체 문자열

    그루핑은 중첩으로도 가능하며 안에 인덱스 값은 에서 안으로 갈 때 인덱스는 증가한다

    ➰코드

    >>> p = re.compile(r"(\w+)\s+((\d+)[-]\d+[-]\d+)")
    >>> m = p.search("김지명 010-6614-1234")
    >>> print(m.group(1))
    >>> print(m.group(2))
    >>> print(m.group(3))

    ➰결과값

    김지명
    010-6614-1234
    010

    💢그루핑 활용

    ✅재참조

    그루핑의 또 하나 좋은점은 문자열을 재참조 할 수 있다는 점이다.

    import re
    
    p = re.compile(r'(\b\w+)\s+\1')  
    print(p.search('Korean in in the Asia').group())
    >>> in in

    저기서 숫자는 앞에 그루핑되어있는(\b\w+)를 의미하고 공백뒤에 동일한 문자가 올 때 찾아주는 것을 의미한다

    ✅이름붙이기

    (?P<name>\w+)\s+((\d+)[-]\d+[-]\d+)

    위에 코드와 같은 형태로 우리는 특정한 그룹에 이름을 지정할 수가 있다.
    위에서 사용했던 것을 그대로 가져와 적용 시켜보자

    import re
    p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
    m = p.search("김지명 010-6614-1234")
    print(m.group("name"))
    print(m.group("phone"))
    
    >>> 김지명
    >>> 010-6614-1234

    ✅이름 붙혀서 재참조

    import re
    
    p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)')  
    print(p.search('Korean in in the Asia').group())

    위에서 학습했던 이름붙이기와 재참조를 결합하여 특정한 그룹에 이름을 주고 그 이름을 이용하여 재참조를 한 코드이다

    💢전후방탐색


    전후방 탐색이란 원하는 뭔자열을 범위를 지정해 뽑아내는것을 의미한다

    • 전방탐색
      • 긍정형
      • data = re.search('.+(?=:)', 'http://www.google.com') print(data.group()) >>>http
      • 부정형위 코드는 foo.bar, autoexec.bat, sendmail.cf와 같은 파일이름 + . + 확장자를 나타내는 정규식이다. 여기서 확장자가 bat인 파일은 제외해야 할 경우 어떤식으로 할 수 있을까??!를 사용하여 bat확장자를 처리 할 수 있다. bar도 포함시키고 싶을때는 bat|bar 이런식으로 사용할 수 있다.
      • .*[.](?!bat$)
      • .*[.].*$
    • 후방탐색
    • 말 그대로 특정한 문자열을 지정하면 그 뒤에 있는 값들을 뽑아낼 수 있다.
    data = re.search('(?<=//).+', 'http://www.google.com')
    print(data.group())
    >>> www.google.com

    참고자료 영상:https://www.youtube.com/watch?v=dTDoTR0MXjU&list=RDCMUCQNE2JmbasNYbjGAcuBiRRg&start_radio=1&rv=dTDoTR0MXjU&t=4)
    참고자료: https://wikidocs.net/4309

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

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

    댓글

Designed by Tistory.