python 정규 표현식 질문

조회수 259회
pa = re.compile("(?P<A>\w+)(?:\[(?P<B>\d+):(?P<C>\d+)\]|\[(?P<D>\d+)\])?")

위의 정규 표현식의 의미가 궁금합니다. (?P<A>\w+)(?P<D>\d+) 두 개는 이해했습니다.

제가 막혔던 것이 가운데 부분이 이해가 되지 않습니다.

가운데 부분 (?:\[(?P<B>\d+):(?P<C>\d+)\]|\[(?P<D>\d+)\])? 여기서 ?:\이 의미하는 것은 무엇인지요??그리고 마지막에 ?는 또 무슨 의미 인가요? [ ]이걸로 감싸기 전에 \이것을 넣어야 하는건지....

1 답변

  • 제가 보기엔 파이썬 리스트 인덱서와 관련된 것 같습니다. 여기서 테스트 해 본 결과

    my_list[3]
    # Match 1: my_list[3]
    # Group A: my_list
    # Group D: 3
    
    my_list[2:5]
    # Match 1: my_list[2:5]
    # Group A: my_list
    # Group B: 2
    # Group C: 5
    

    과 같이 색인되었습니다.

    (?P<A>\w+) 의 의미는 모든 문자를 Group A로 묶고, (?:\[(?P<B>\d+):(?P<C>\d+)\]|\[(?P<D>\d+)\]) 의 or을 쪼개면 \[(?P<B>\d+):(?P<C>\d+)\]\[(?P<D>\d+)\] 로 나누어 지는데,
    이는 대괄호 안의 콜론 여부에 따라 그룹을 B, C 또는 D로 나누려는 것 같습니다.
    마지막 ?는 정말로 모르겠네요.

    추측으로는 오류 검출용이 아닐까 싶습니다.

    my_list[3]error
    # Match 1: my_list[3]
    # Group A: my_list
    # Group D: 3
    # Match 2: error
    # Group A: error
    

    보시다시피 Match 2에 잡히는데 마지막에 있는 ?를 없애면 잡히지 않습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)