티스토리 뷰

반응형

특정 문자열 사이 문자열 추출하기 (HTML tag 사이 문자열 추출)

Wikipedia dump data 추출을 하면서 특정 문자열 사이에 있는 문자열을 추출해야 하는 상황이 생겼다.

정규식이 익숙지 않았던 터라 여러 sample 들을 짜깁기 한 결과 드디어 성공을 했다...u_u

regexr.com에서 열심히 짜깁기 해보자.

별거 아니긴 하지만 특정 문자 사이 문자 추출은 자주 사용하게 될 것 같아서 기록해 두고자 한다.

예를 들어, HTML tag 사이 문자열을 추출할 수도 있을 것 같다.

Wikipedia dump data 문자열 추출 후 HTML tag 사이 문자열도 추출해보자.

TEXT 문자열 추출

text

<page><title>지미 카터</title><ns>0</ns><id>5</id><revision><id>30712206</id><parentid>30702239</parentid><timestamp>2021-11-17T05:16:11Z</timestamp><contributor><ip>211.210.176.50</ip></contributor><comment>/* 평가 */</comment><model>wikitext</model><format>text/x-wiki</format><text bytes="14208" xml:space="preserve">{{국가원수 정보| 이름 = 제임스 얼 카터 주니어| 원래 이름 = {{lang|en|James Earl Carter Jr.}}| 그림 = JimmyCarterPortrait2.jpg| 크기 = 300px| 국가 = 미국| 대수 = 39| 취임일 = [[1977년]] [[1월 20일]]| 퇴임일 = [[1981년]] [[1월 20일]]| 부통령 = [[월터 먼데일]]| 전임 = 제럴드 포드| 전임대수 = 38| 후임 = 로널드 레이건| 후임대수 = 40&lt;!--주지사--&gt;|국가2 = [[조지아주]]|명칭2 = [[주지사]]|대수2 = 76|취임일2 = [[1971년]] [[1월 12일]]|퇴임일2 = [[1975년]] [[1월 14일]]|부통령2 = 레스터 매독스|부통령명칭2 = 부주지사&lt;br /&gt;(Lieutenant)|전임2 = 레스터 매독스|전임대수2 =|후임2 = 조지 버스비|후임대수2 =&lt;!--주의회 상원 의원--&gt;|공직2 = [[조지아주]] 의회|공직2명칭 = 주 상원 의원 (제14구역)|공직2대수 =|공직2취임일 = [[1963년]] [[1월 14일]]|공직2퇴임일 = [[1967년]] [[1월 10일]]|공직2전임 =|공직2후임 = 휴 카터| 국적 = [[미국]]| 출생일 = {{출생일과 나이|1924|10|1}}| 출생지 = [[미국]] [[조지아주]] [[플레인스 (조지아)|플레인스]]| 사망지 =| 정당 = [[민주당 (미국)|민주당]]| 학력 = [[조지아 남서 주립대학교]]&lt;br /&gt;[[조지아 공과대학교]]&lt;br /&gt;[[유니언 칼리지]]&lt;br /&gt;[[미국 해군사관학교]]| 종교 = [[침례교]]| 배우자 = [[로절린 카터]]| 자녀 = 슬하 3남 1녀| 서명 = Jimmy Carter Signature-2.svg| 웹사이트 = http://www.cartercenter.org/index.html| 서훈= {{노벨상 딱지|평화상|2002}}}}'''제임스 얼 카터 주니어'''({{llang|en|James Earl Carter, Jr.}}, [[1924년]] [[10월 1일]] ~ )는 [[민주당 (미국)|민주당]] 출신 [[미국]] 39대 대통령 ([[1977년]] ~
...
...
...
[[분류:지미 카터| ]][[분류:1924년 출생]][[분류:1976년 미국 대통령 후보]][[분류:1980년 미국 대통령 후보]][[분류:그래미상 수상자]][[분류:노벨 평화상 수상자]][[분류:미국 해군의 장교]][[분류:미국의 침례교도]][[분류:미국의 노벨상 수상자]][[분류:미국의 농부]][[분류:미국의 대통령]][[분류:미국의 역사 (1964-1980)]][[분류:미국의 외교관]][[분류:미국의 인도주의자]][[분류:미국의 제2차 세계 대전 참전 군인]][[분류:미국의 진보주의]][[분류:민주당 (미국)의 정치인]][[분류:살아있는 사람]][[분류:스코틀랜드계 미국인]][[분류:아일랜드계 미국인]][[분류:잉글랜드계 미국인]][[분류:조지아 공과대학교 동문]][[분류:조지아주의 정치인]][[분류:조지아주지사]][[분류:미국의 회고록 작가]][[분류:에모리 대학교 교수]][[분류:미국 해군사관학교 동문]][[분류:미국 버지니아 종합군사학원 동문]][[분류:미국 미주리 종합군사학원 동문]][[분류:타임 올해의 인물]][[분류:군사 기술자]][[분류:이란 혁명 관련자]][[분류:미국의 민주주의 운동가]][[분류:주이란 미국 대사관 인질 사건]][[분류:조지아주의 민주당 당원]][[분류:조지아주 출신 작가]][[분류:소련-아프가니스탄 전쟁 관련자]][[분류:20세기 미국 사람]][[분류:21세기 미국 사람]]</text><sha1>q3pimv7nxa6hfq082u1ix336qwl4pjk</sha1></revision></page>

여기서 [[분류:21세기 미국 사람]] 형태의 분류 정보들만 뽑아내고 싶었다.

[[분류:]] 사이 정보를 추출해야 했다.

결론은, /(?<=\[\[분류:)(.*?)(?=\]])/g 으로 찾을 수 있다.

  • (?<=\[\[분류:) : [[분류 를 기준으로 그 뒤 문자열 탐색
  • (.*?) : 최소 패턴 일치, 뒤에 오는 문자열을 만날 때까지 포함
  • (?=\]]) : ]] 기준으로 그 앞 문자열 탐색

Python Code

from xml.etree import ElementTree
import re

root_element = ElementTree.fromstring(page) # 문자열에서 XML 파싱

title = root_element.find('title').text
_id = root_element.find('id').text
text = root_element.find('revision').find('text').text

p = re.compile('(?<=\[\[분류:)(.*?)(?=\]])')
tag_list = p.findall(text)

print(title)
print(_id)
print(tag_list)

Result

지미 카터

5

['지미 카터| ', '1924년 출생', '1976년 미국 대통령 후보', '1980년 미국 대통령 후보', '그래미상 수상자', '노벨 평화상 수상자', '미국 해군의 장교', '미국의 침례교도', '미국의 노벨상 수상자', '미국의 농부', '미국의 대통령', '미국의 역사 (1964-1980)', '미국의 외교관', '미국의 인도주의자', '미국의 제2차 세계 대전 참전 군인', '미국의 진보주의', '민주당 (미국)의 정치인', '살아있는 사람', '스코틀랜드계 미국인', '아일랜드계 미국인', '잉글랜드계 미국인', '조지아 공과대학교 동문', '조지아주의 정치인', '조지아주지사', '미국의 회고록 작가', '에모리 대학교 교수', '미국 해군사관학교 동문', '미국 버지니아 종합군사학원 동문', '미국 미주리 종합군사학원 동문', '타임 올해의 인물', '군사 기술자', '이란 혁명 관련자', '미국의 민주주의 운동가', '주이란 미국 대사관 인질 사건', '조지아주의 민주당 당원', '조지아주 출신 작가', '소련-아프가니스탄 전쟁 관련자', '20세기 미국 사람', '21세기 미국 사람']

아주 만족스럽게 분류 정보들만 잘 뽑혔다 :)

HTML Tag 사이 추출

HTML tag 사이 문자열도 추출해보자.

text

<p>
  정규 표현식이라는 문구는 일치하는 텍스트가 준수해야 하는 "패턴"을 표현하기
  위해..
</p>
<p>문자열1</p>
<p>문자열2</p>
<p>문자열3</p>

여기서도 마찬가지로 <p></p> 사이 문자열을 뽑아내야 한다.

(?<=\<p>)(.*?)(?=<\/p>)

  • (?<=\<p>) : <p> 를 기준으로 그 뒤 문자열 탐색
  • (.*?) : 최소 패턴 일치, 뒤에 오는 문자열을 만날 때까지 포함
  • (?=<\/p>) : </p> 기준으로 그 앞 문자열 탐색

Python Code

import re

html_source = '<p>정규 표현식이라는 문구는 일치하는 텍스트가 준수해야 하는 "패턴"을 표현하기 위해..</p><p>문자열1</p><p>문자열2</p><p>문자열3</p>'
p = re.compile('(?<=\<p>)(.*?)(?=<\/p>)')
p_tag_list = p.findall(html_source)

print(p_tag_list)

Result

['정규 표현식이라는 문구는 일치하는 텍스트가 준수해야 하는 "패턴"을 표현하기 위해..', '문자열1', '문자열2', '문자열3']
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday