4장 연습 문제 15번

이번 문제는 주어진 텍스트에서 태그를 제외한 정보를 출력하는 문제이다. 이때 태그란 < > 로 표현된 문자열이다.

주어진 문자열은
s = """
<body bgcolor="#FFFFFF">
Click <a href="http://www.python.org/"> Here </a>
To connect to the most powerful tools in the world.
</body>
</html>
"""
이다.

이 문제를 풀기위해 여러가지 생각을 해보다가 결국 정규식을 써보기로 했다.

정규식과 관련해서 4장 연습문제 2번에 정규식을 조사 해보라는 문제가 있었다.

이것을 이 문제에 적용 해 보았다.
>>> import re
>>> print re.sub('<(.*?)>', '', s)


Click  Here 
To connect to the most powerful tools in the world.

이와 같이 작성 했다.

정규식의 의미를 조금 분석해 보면 sub 메소드는 매치되는 문자열을 대치 하는 것이다.

즉 '<(.*?)>' 을 만족하는 문자열의 매치 부분을 '' 로 대치한다.

그리고 '<(.*?)>' 에서 . 은 모든 문자를 의미 하고 *은 반복 횟수로 0번 이상을 의미 한다.

그리고 좌우의 < > 는 태그만을 매치 시키기 위해 나타낸 것이다.

이때 ? 를 꼭 넣어야 하는데, 안 넣게 되면, 정규식에서 매치하는 부분이 넓게 매치가 된다.

즉, Click <a href="http://www.python.org/"> Here </a> 에서 처음의 < 와 끝의 > 만을 인식하여 매치 하기에 결과 값이 Click 만 나오게 된다.

그리고 참고로, 이 문제를 풀다가 생각 나서 한국 파이썬 사용자 모임에 질문을 올려 보았다.

질문 내용은 < > 의 경우 그대로 쓰면 되지만 ( ) 나 [ ] 는 정규식을 묶어주는 기능이 있기에 그대로 쓰면 매치가 안된다.

이것을 해결 하는 방법은 \( , \) , \[ , \] 로 쓰게 되면 문자열의 ( ) , [ ] 부분을 매치 하게 된다.

댓글 2개:

  1. ?를 사용하는거랑 안하는거의 차이를 모르겠습니다... 앞의문자가 0혹은 1회라는데 이게 무슨의미죠,,

    답글삭제
    답글
    1. ?만 쓰면 앞의 문자가 0 또는 1회 반복이라는 의미지만, *?를 함께 쓰면 non-greedy 매칭을 하라는 의미입니다. 즉, 최소한의 매칭만 하게 됩니다.

      삭제