주어진 문자열은
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 만 나오게 된다.
그리고 참고로, 이 문제를 풀다가 생각 나서 한국 파이썬 사용자 모임에 질문을 올려 보았다.
질문 내용은 < > 의 경우 그대로 쓰면 되지만 ( ) 나 [ ] 는 정규식을 묶어주는 기능이 있기에 그대로 쓰면 매치가 안된다.
이것을 해결 하는 방법은 \( , \) , \[ , \] 로 쓰게 되면 문자열의 ( ) , [ ] 부분을 매치 하게 된다.
?를 사용하는거랑 안하는거의 차이를 모르겠습니다... 앞의문자가 0혹은 1회라는데 이게 무슨의미죠,,
답글삭제?만 쓰면 앞의 문자가 0 또는 1회 반복이라는 의미지만, *?를 함께 쓰면 non-greedy 매칭을 하라는 의미입니다. 즉, 최소한의 매칭만 하게 됩니다.
삭제