Pythhon 정규 표현식을 사용하여 임의의 문자열 그룹 추출/이름 지정 그룹 사용

9014 단어 Python
이 글은 Takumi Akashiro 혼자 Advent Calendar 2020 18일째 되는 글이다.

개시하다


정규 표현식 사용하셨나요?!!!
제가 마지막으로 사용한 게 한 달 전쯤이었죠.
필요할 때 오시면 열심히 쓰실 거예요.
이런 정규 표현식이지만 잘 사용하면 임의의 문자열을 추출할 수 있다는 느낌을 준다.

TLDL


문자열을 추출할 때 이름 그룹을 사용하십시오!
>> text = "environ/house-food/apple-pie02.fbx"
>> import re
>> reg_text = r'(?P<main>(chara|environ))/(?P<sub>[^-/]*)-?(?P<sub_sub>[^/]*)/(?P<filling>[^-]*)-pie'
>> match = re.search(reg_text, text)
>> print(match.groupdict())
{'main': 'environ', 'sub': 'house', 'sub_sub': 'food', 'filling': 'apple'}

정규 표현식의 기본


우선 정규 표현식에 대해 기본적이고 적당한 일치를 한다.
#! python3
import re

def main():
    # NOTE: どうでもいいですけど、正規表現のサンプルでアップルパイってよく見かけますよね。
    text = "environ/house-food/apple-pie02.fbx"

    match_obj= re.search(r'pie', text)
    if match_obj:
        print("ヒットしたよ!")
    else:
        print("ヒットしないよ!")

if __name__ == '__main__':
    main()

뭐, 그렇습니다.아주 간단하네요.
만약 속도가 구한다면 시작이 일치할 때re.match에 사용하거나 교체하고 싶을 때re.sub에 사용할 수 있다
어쨌든 정규 표현식을 사용하는 것은 문제가 없을 것이다.1
그럼 앞의 문자열pie을 어떻게 추출합니까?
나는 각양각색의 문자열을 삭제한 후에 꺼내고 싶다.
그런데 상대를 많이 얻었을 때는?예를 들어 단숨에 apple,environhouse를 얻고 싶은 경우?
이럴 때 사용할 수 있는 것은 단체다.
공식 문서를 읽어봅시다.

정규 표현식의 문법


(중략)
(...)
괄호로 묶인 정규 표현식과 일치하며 조합의 시작과 끝을 표시합니다.
그룹의 내용은 다음과 같습니다. 성냥을 실행한 후에 회수하거나, 이 문자열에서 나중에\number 특수 서열로 일치할 수 있습니다.
"('또는')"를 일치시키려면 (지원) 또는 문자 카테고리를 사용하여 [, [)]를 둘러쌉니다.
re-정규 표현식 작업 - Python 3.9.1 문서에 따라
...어떻게 쓰는지 모르겠어..
그래서 샘플을 꺼내 보겠습니다.

그룹 작업

#! python3
import re

def main():
    text = "environ/house-food/apple-pie02.fbx"

    match_obj= re.search(r'([^/-]*)-?pie)', text)
    print(match_obj.groups())

if __name__ == '__main__':
    main()


객체 일치food를 통해
귀일화 정규 표현식과 관련된 문자열 목록을 얻을 수 있습니다.
따라서 상기 apple에서 꺼내기match_obj.groups(), textenviron를 고려하여
#! python3
import re

def main():
    text = "environ/house-food/apple-pie02.fbx"

    match = re.search(r'([^/-]*)/([^/-]*)-?([^/-]*)/([^/-]*)-?pie', text)
    if match:
        print(match.groups())

if __name__ == '__main__':
    main()

그렇다면..

잘 끝냈네요!
그런대로 편리한 편이야!house 말고 food 이런 거 갖고 싶어요.
정규 표현은 자주 사용하고apple 필요한 부분만 있으면 된다고 생각합니다.
그때가 바로 이 "이름이 있는 그룹"!
예와 같이 공식 문서를 읽어 보세요.

정규 표현식의 문법


(중략)
(?P...)
일반적인 괄호와 유사하지만, 이 조합이 일치하는 하위 문자열은 기호 그룹 이름name으로 접근할 수 있습니다.
그룹 이름은 유효한 Python 식별자여야 하며 각 그룹 이름은 정규 표현식에 한 번 정의되어야 합니다.
기호 그룹은 이름이 없는 것처럼 번호가 지정된 그룹입니다.

이름 지정 그룹 사용


뭐, 일단 쓰면 알 수 있는 정신으로 쓰자.
#! python3
import re

def main():
    text = "environ/house-food/apple-pie02.fbx"

    match = re.search(r'(?P<main>[^/-]*)/(?P<sub>[^/-]*)-?(?P<sub_sub>[^/-]*)/(?P<filling>[^/-]*)-?pie', text)
    if match:
        print(match.groupdict())

if __name__ == '__main__':
    main()

객체 일치list를 통해
이름이 붙은 그룹 사전을 얻을 수 있습니다.

괜찮은 것 같아!

끝맺다


아무 생각도 못했어..
아주 편리하군요!
추기: 속도를 의식한다면 for환에서 같은 정규 표현식을 사용할 때 for 이외dict에서 사용하면 조금 빠르다. 

좋은 웹페이지 즐겨찾기