ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 정규표현식 (기초편)
    내일배움캠프/Python 2024. 7. 15. 21:40

    정규표현식 목차

     

    웹 스크래핑하고서 특정 데이터만 추출할 필요가 있을 때가 있습니다.

    예를 들어 여러 개인정보가 섞인 데이터에서 전화 번호 000-0000-0000만을 가져와야한다고 가정해봅시다.

    이 때 필요한게 정규표현식입니다.

     

    복잡한 문자열을 처리할 때

    훨신 간편하고 직관적인 코드를 작성할 수 있게 해줍니다.

     

    메타 문자와 문자클래스를 이용해서 특정 데이터의 패턴을 만들고

    match, search 등의 매서드를 통해서

    데이터에서 특정 데이터를 추출합니다.

     

    정규 표현식에서 쓰이는 메타 문자, 매서드에 대해서 알아보겠습니다.

     

     


     

     

    메타 문자

     

     

    메타 문자는 정규표현식을 만드는데 사용되는 문자를 뜻합니다.

    메타 문자에[], {}, ?, +, * 등이 있는데

    원래 그 문자가 가진 뜻이 아닌 특별한 뜻을 지닙니다.

     

     

    1. [] (대괄호)

     

    대괄호 안의 문자가 데이터에 있는지 확인을 해줍니다.

     

    예를 들어

    [abc]는 데이터에 a, b, c 중 하나만 있으면 된다는 의미입니다.

    [a-z]에서 -는 우리가 아는 ~와 비슷한 의미로

    데이터에 a부터 z까지 중에서 하나만 있으면 된다는 의미입니다.

     

    2. .(dot)

     

    줄바꿈 문자인 \n을 제외한 모든 문자를 의미합니다.

     

    예를 들어

    a.b는 'a + \n을 제외한 모든 문자 + b'를 의미합니다.

    데이터에서 acb, a0b 등을 추출하기 위해서

    a.b 정규표현식을 쓸 수 있습니다.

     

    만약 메타 문자 .(dot)이 아닌 우리가 아는 일반적인 .(dot)을 쓰고 싶다면

    a[.]b를 사용해주면 됩니다.

     

    3. *(곱셈 기호)

     

    바로 앞에 있는 문자의 반복을 의미합니다.

    이 때 반복의 횟수는 0도 되고 1, 2, ... 도 될 수 있습니다.

     

    예를 들어

    ab*c를 사용하여

    ac, abc, abbbc, abbbbbc 등의 데이터를 추출할 수 있습니다.

     

    4. +(덧셈 기호)

     

    +도 바로 앞에 있는 문자의 반복을 의미합니다.

    다만 이 때는 문자가 최소 1번 이상 반복되어야 합니다.

     

    즉, ab+c라고 하면

    abc, abbbc는 되지만 ac는 추출할 수 없습니다.

     

    5. {}(중괄호)

     

    {}는 바로 앞에 있는 문자의 반복 횟수를 직접 정해줄 수 있습니다.

     

    ab{1, 3}c를 통해서

    abc, abbc, abbbc 데이터를 추출할 수 있습니다.

     

    6. ?(물음표)

     

    바로 앞에 있는 문자가 있어도 되고 없어도 된다는 의미입니다.

     

    따라서 ab?c는

    ac도 되고 abc도 됩니다.

     

    7. ^(제곱 기호)

     

    반대(not)을 뜻합니다.

    [^a-z]는 영어 소문자인 a부터 z를 제외한다는 의미를 갖고 있습니다.

     

    (다만 [](대괄호) 안의 ^일 때만 부정의 의미를 갖습니다..)

     

    문자 클래스

     

     

     

    문자 클래스를 통해 내가 가져오고자 하는 문자형을 가져올 수 있습니다.

     

    1. \d

     

    숫자를 가져옵니다.

    [0-9]와 같은 의미입니다.

     

    2. \D

     

    숫자가 아닌 문자를 가져옵니다.

    [^0-9]와 같은 의미입니다.

     

    3. \s

     

    화이트 스페이스를 의미합니다.

    화이트 스페이스는 ' ', \n, \t 등과 같이 공백 문자를 의미합니다.

    [\t\n\r\f\v]와 같은 의미입니다.

     

    4. \S

     

    화이트 스페이스가 아닌 것을 가져옵니다.

     

    5. \w

     

    문자 + 숫자를 가져옵니다.

    [a-zA-Z0-9_]와 같은 의미입니다.

     

    6. \W

     

    문자와 숫자가 아닌 것을 가져옵니다.

    [^a-zA-Z0-9_]를 의미합니다.

     

     

     

    매서드

     

     

    매서드는 메타 코드와 문자 클래스로 표현한 정규표현식에 맞는

    데이터를 추출해주는 함수입니다.

     

    1. match()

     

    문자열의 처음부터 정규식과 매치되는지 조사하여 결과를 반환합니다.

     

    m = re.match('[a-z]+', "python")

     

    [a-z]+는 추출할 문자열인 'python'에서

    영어 소문자가 1개 이상인 데이터를 가져오므로

    결과값으로 python이 나올 것입니다.

     

    2. search()

     

    문자열 전체를 검색하여 정규식과 매치되는 데이터 하나를 가져옵니다.

     

    p = re.compile(정규표현식)

    m = p.search('3 python')
    print(m)

     

    p 변수에 내가 정규표현식을 담았고

    search 함수를 통해서

    '3 python'에서 정규표현식에 매치되는 데이터를 가져옵니다.

     

    정규표현식이 [a-z]+ 였다면 'python'을 가져왔을테고

    [0-9]+ 였다면 '3'을 가져왔겠습니다.

     

    3. findall()

     

    정규식과 매치되는 모든 문자열을 리스트로 가져옵니다.

     

    p = re.compile('정규표현식')

    result = p.findall('life is too short')
    print(result)

     

    만약 정규표현식이 영어 소문자를 가져오는 식이었다면

    ['life', 'is', 'too', 'short']를 결과로 가져왔을 겁니다.

     

    4. finditer()

     

    정규식과 매치되는 모든 문자열을 반복 가능한 객체로 가져옵니다.

     

    p = re.compile('정규표현식')

    result = p.finditer('life is too short')
    for r in result:
        print(r)

     

    반복 가능한 객체로 가져와서

    for같은 반복문과 함께 쓰일 수 있습니다.

     

     

    객체 매서드

     

     

    정규표현식을 써서 추출한 데이터의 정보의

    어떤 것을 가져올지 정할 수 있습니다.

     

    1. group()

     

    정규표현식을 사용해서 가져온 데이터 변수에 print()를 적용해주면

     

    <re.Match object; span=(2, 8), match='python'>

     

    이런 결과가 나옵니다.

     

    뭔가 보기 불편하지 않나요?

    그럴 때 데이터 변수에 group을 써주면

     

    print(m.group())

     

    'python'만 얻을 수 있답니다..

     

    2. start()

     

    매치된 문자열의 시작 위치를 리턴해줍니다.

     

    3. end()

     

    매치된 문자열의 끝 위치를 리턴해줍니다.

     

    4. span()

     

    매치된 문자열의 시작과 끝 인덱스를

    튜플에 담아서 리턴해줍니다.

     

     


     

     

    여기까지 정규표현식 관련 간단한 개념을 다뤄봤습니다..

    다음에는 정규 표현식 심화와 응용으로 찾아뵙겠습니다..

Designed by Tistory.