emrhssla
694
2021-08-17 16:53:17
4
221

정규식 표현식 질문이요!


문제 5: 16진수를 찾는 정규식을 작성하라. 16진수는 아라비아 숫자 10개 또는 A-F, a-f를 사용하되 대문자와 소문자를 섞어 쓰지는 않는다. 또한, 16진수임을 나타내기 위해 숫자 바로 앞에 ‘0x’나 ‘&H’(hexa의 의미)를 붙이거나, 혹은 숫자 뒤에 ‘H’를 붙인다.


정답 : r'(\b0x|&H)?(?:[0-9A-F]+|[0-9a-f]+)(?(1)|H?)\b'

해설 :

  1. (\b0x|&H)?: 보통 단어 경계를 맨 앞에 두는데, 이번엔 다자택일 중 하나에 두었다. 이유는 엠퍼샌드(‘&’)는 문자 집합에 포함되지 않으므로 단어 경계를 쓰면 안 된다.
    1. 앞에 16진수 식별자를 두는 것은 선택적이므로 ?를 쓴다.
    2. 그리고 이 부분은 첫 번째 캡처 그룹을 형성한다.
  2. (?:[0-9A-F]+|[0-9a-f]+): 16진수 숫자를 나타내는 부분만 빼고 싶다면 앞부분의 비 캡처 그룹임을 의미하는 ?:를 빼면 된다.
    1. 대소문자 혼용을 허용하지 않았으므로 대문자를 쓸 때와 소문자를 쓸 때를 분리하였다.
  3. (?(1)|H?): 조건문이다. 첫 번째 캡처 그룹에서 만약에 ‘0x’나 ‘&H’가 일치되었으면, 뒤에 또 ‘H’ 식별자를 두지는 않는다. 따라서 일치되었으면(‘맞으면’) 아무것도 없는 경우를, 일치되지 않았으면 ‘H’ 식별자를 선택적으로 일치시킬 수 있도록 한다.
  4. \b: 단어 경계이다.

 

여기서 궁금한게 다알겠는데 3.에서 (?(1)|H?) H뒤에 ?는 무슨 의미인가요..,?

출처: https://greeksharifa.github.io/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D(re)/2018/08/06/regex-usage-07-example/



1
  • 답변 4

  • 안전라이딩
    2021-08-17 17:26:59 작성 2021-08-17 17:28:59 수정됨
  • emrhssla
    694
    2021-08-17 17:49:33

    문제의 조건이 숫자앞에 '0x or &H' 가 있거나 숫자뒤에 'H' 를 붙인다. 즉 앞뒤중 하나는 무조건 있어야한다는 뜻으로 해석되는데.. 

    (?(1)|H?) 뜻이 (1)이 참이 아니면 H나 아무것도 없어야 한다. 라는 뜻인데

    (1)이 없으면 무조건 H가 있어야하만 하지않나요?

  • 안전라이딩
    2021-08-17 18:07:05
  • emrhssla
    694
    2021-08-18 11:30:35

    내용은 이해했는데 .. 제생각이 어디가 틀린건지모르겠어요..


  • 로그인을 하시면 답변을 등록할 수 있습니다.