2013-04-24 2 views
3

다음과 비슷한 OPML 파일을 검색하고 있습니다. 개요 텍스트와 xmlUrl을 가져 오려고합니다.정규식을 사용하여 OPML (XML) 파일에서 인용 된 속성 값을 찾는 방법

<outline text="lol"> 
    <outline text="Discourse on the Otter" xmlUrl="http://discourseontheotter.tumblr.com/rss" htmlUrl="http://discourseontheotter.tumblr.com/"/> 
    <outline text="fedoras of okc" xmlUrl="http://fedorasofokc.tumblr.com/rss" htmlUrl="http://fedorasofokc.tumblr.com/"/> 
    </outline> 

내 기능 : 나는 단지 문자열을 반환하도록 rssName 및 rssUrl에 대한 적절한 정규식 표현을 무엇

outline text="fedoras of okc" 
xmlUrl="http://fedorasofokc.tumblr.com/rss" 

:

import re 
rssName = 'outline text="(.*?)"' 
rssUrl = 'xmlUrl="(.*?)"' 

def rssSearch(): 
    doc = open('ttrss.txt') 
    for line in doc: 
     if "xmlUrl" in line: 
      mName = re.search(rssName, line) 
      mUrl = re.search(rssUrl, line) 
      if mName is not None: 
       print mName.group() 
       print mUrl.group() 

그러나, 반환 값으로 나올 따옴표 사이에?

+0

질문과는 관계가 없지만 여전히 도움이 될 것입니다. 정규식을 미리 컴파일하여 몇 초를 절약 할 수 있습니다 실행 시간 'rssName = re.compile ('개요 텍스트 = "(. *?)")'와'mName = rssName.search (line)'을 사용하십시오. – kay

+3

왜 정규식을 통해 이것을하고 싶습니까? 올바른 도구가 아닙니다. XML 파서를 사용하십시오. 표준 라이브러리에는 몇 가지가 있습니다. –

+0

@ DanielRoseman의 제안과 관련하여 부엌 싱크대를 포함하여 사용하기 쉬운 것을 원한다면 아름다운 수프 라이브러리의 XML 파싱 구성 요소 인 아름다운 돌 수프를 살펴보십시오. – Endophage

답변

3

는 XML을 구문 분석하는 정규 표현식을 사용하지 마십시오. 코드가 지저분하고 잘못 될 수있는 것들이 너무 많습니다. 완벽하게 유효한의

<outline text="lol"> 
    <outline 
     htmlUrl="http://discourseontheotter.tumblr.com/" 
     xmlUrl="http://discourseontheotter.tumblr.com/rss" 
     text="Discourse on the Otter" 
    /> 
    <outline 
     htmlUrl="http://fedorasofokc.tumblr.com/" 
     xmlUrl="http://fedorasofokc.tumblr.com/rss" 
     text="fedoras of okc" 
    /> 
</outline> 

, 그리고 정확히 같은 일을 의미한다 : 예를 들어

는 어떤 경우 OPML 제공자는 다음과 같이 자신의 출력을 포맷 발생합니다. 그러나 라인 지향 검색 및 'outline text="(.*?)"'과 같은 정규 표현식은 중단됩니다.

대신 XML 구문 분석기를 사용하십시오. 코드는, 청소기 간단하고 더 신뢰할 수있을 것입니다 :

이 당신의 OPML 조각 나는이 political science list 같은 웹에서 발견 유사한 OPML 파일을 모두 처리
import xml.etree.cElementTree as ET 

root = ET.parse('ttrss.txt').getroot() 
for outline in root.iter('outline'): 
    text = outline.get('text') 
    xmlUrl = outline.get('xmlUrl') 
    if text and xmlUrl: 
     print text 
     print xmlUrl 

. 그리고 그것에 대해 까다로울뿐 아니라 매우 간단합니다. (나는 그다지 자랑스럽지 않습니다. 정규 표현식 대신 XML 구문 분석기를 사용하면 얻을 수있는 이점입니다.)

2

http://docs.python.org/2/library/re.html#re.MatchObject.group

groupN 인수가 0 대응 반환 값은 전체 매칭 스트링 인 경우

print mName.group(1) 
print mUrl.group(1) 
시도; 포괄적 범위 [1..99]에 있으면 대응하는 괄호로 묶은 그룹과 일치하는 문자열입니다.

또는

rssName = 'outline text="(?P<text>.*?)"' 

다음

print mName.group('text') 
+0

감사합니다! 1은 무엇을 가리키며 어떻게 문제를 해결 했습니까? – jumbopap

+1

게시물을 편집했습니다. 확인해주세요. :) – nacholibre