문제

RSS 2.0 피드에서 제목 태그를 해당 피드의 각 항목에 대해 세 가지 변수로 구문 분석하려고합니다. EmplicTree를 사용하여 이미 RSS를 구문 분석하여 각 제목을 인쇄 할 수 있습니다 [트레일 링 마이너스 )] 아래 코드와 함께 :

feed = getfeed("http://www.tourfilter.com/dallas/rss/by_concert_date")

for item in feed:  
 print repr(item.title[0:-1])

보시다시피, 항목은 repr () 데이터 유형이므로 잘 모르기 때문에 포함합니다.

특히 repr(item.title[0:-1]) print대화식 창에서의 ED는 다음과 같습니다.

'randy travis (Billy Bobs 3/21'
'Michael Schenker Group (House of Blues Dallas 3/26'

사용자는 밴드를 선택하고 각각을 구문 분석 한 후 item.title 3 개의 변수 (밴드, 장소 및 날짜에 대해 각각 하나 또는 배열 또는 어레이를 모릅니다 ...) 선택한 밴드와 관련된 것만 선택하십시오. 그런 다음 지오 코딩을 위해 Google로 보내 지지만 또 다른 이야기입니다.

나는 몇 가지 예를 보았다 regex 그리고 나는 그들에 대해 읽고 있지만 매우 복잡해 보입니다. 그게? 나는 여기에 누군가가 이것을 지능적으로 정확하게하는 방법에 대한 통찰력을 가질 것이라고 생각했을 것입니다. 내가 사용해야할까요 re 기준 치수? 출력이 현재 인 것이 중요합니까? repr()에스? 더 좋은 방법이 있습니까? 나는 내가 같은 루프를 사용할 것이라고 생각하고 있었다 (그리고 이것은 내 유사 파시 톤이다.

     list = bandRaw,venue,date,latLong  
     for item in feed:  
      parse item.title for bandRaw, venue, date  
       if bandRaw == str(band)   
        send venue name + ", Dallas, TX" to google for geocoding  
        return lat,long  
      list = list + return character + bandRaw + "," + venue + "," + date + "," + lat + "," + long  
     else  

결국, 나는 .csv (comma delimited) 파일에 선택한 항목을 다음과 같이보아야합니다.

band,venue,date,lat,long  
randy travis,Billy Bobs,3/21,1234.5678,1234.5678  
Michael Schenker Group,House of Blues Dallas,3/26,4321.8765,4321.8765

나는 이것이 너무 많지 않기를 바랍니다. 나는 스스로 그것을 조사 할 것입니다. 그냥 답변을 받기 위해 여기에 게시해야한다고 생각했습니다.

따라서 문제는 각각 어떻게 가장 잘 구문 분석 하는가입니다. repr(item.title[0:-1]) 에서 feed 그런 다음 .csv 파일로 연결할 수있는 3 가지 별도의 값으로?

도움이 되었습니까?

해결책

Regex가 당신을 놀라게하지 마십시오 ... 배울 가치가 있습니다.

위의 예제가 주어지면 후행 괄호를 다시 넣은 다음이 패턴을 사용해 볼 수 있습니다.

import re
pat = re.compile('([\w\s]+)\(([\w\s]+)(\d+/\d+)\)')
info = pat.match(s)
print info.groups()

('Michael Schenker Group ', 'House of Blues Dallas ', '3/26')

각 그룹 개인에게 도달하려면 info 물체:

print info.group(1) # or info.groups()[0]

print '"%s","%s","%s"' % (info.group(1), info.group(2), info.group(3))
"Michael Schenker Group","House of Blues Dallas","3/26"

이 경우 Regex에 대한 어려운 점은 제목에 알려진 모든 가능한 캐릭터를 모두 알 수 있도록하는 것입니다. 'Michael Schenker Group'부분에 알파가없는 경우 해당 부분에 대해 Regex를 조정하여 허용해야합니다.

위의 패턴은 다음과 같이 분해되며 왼쪽에서 오른쪽으로 구문 분석됩니다.

([\w\s]+) : 모든 단어 또는 공간 문자와 일치합니다 (플러스 기호는 하나 이상의 문자가 있어야 함을 나타냅니다). 괄호는 경기가 그룹으로 캡처 될 것임을 의미합니다. 이것이 "Michael Schenker Group"부분입니다. 여기에 숫자와 대시가있을 수 있다면 세트의 가능한 문자 인 사각형 브래킷 사이의 조각을 수정하려고합니다.

\( : 문자 그대로의 괄호. Backslash는 괄호를 피합니다. 그렇지 않으면 Regex 명령으로 간주되기 때문입니다. 이것은 "("문자열의 부분입니다.

([\w\s]+) : 위의 것과 동일하지만 이번에는 "House of Blues Dallas"부분과 일치합니다. 괄호 안에서 두 번째 그룹으로 캡처됩니다.

(\d+/\d+) : 숫자 3과 26을 중간에 슬래시와 일치시킵니다. 괄호 안에서는 세 번째 그룹으로 포착됩니다.

\) : 위의 괄호를 닫습니다.

Python Intro to Regex는 꽤 좋으며 저녁을 보내고 싶을 수도 있습니다. http://docs.python.org/library/re.html#module-re. 또한 친근한 소개가있는 Python으로의 다이빙을 확인하십시오. http://diveintopython3.ep.io/regular-expressions.html.

편집 : 좋은 편집이있는 아래의 Zacherates를 참조하십시오. 한명 보단 두명이 낫다!

다른 팁

정규 표현식은이 문제에 대한 훌륭한 솔루션입니다.

>>> import re
>>> s  = 'Michael Schenker Group (House of Blues Dallas 3/26'
>>> re.match(r'(.*) \((.*) (\d+/\d+)', s).groups()
('Michael Schenker Group', 'House of Blues Dallas', '3/26')

참고로, 당신은 보편적 인 피드 파서 Feed가 기름을 밝히는 습관이 좋지 않기 때문에 RSS 구문 분석을 처리합니다.

편집하다

귀하의 의견과 관련하여 ... 문자열은 때때로 "S가 아닌"S로 감싸는 문자열이 당신이 repr을 사용하고 있다는 사실과 관련이 있습니다. 문자열의 repr은 일반적으로 문자열이 하나가 포함되지 않는 한 일반적으로 구분됩니다. 또는 더 많은 곳, 대신 사용하는 곳 "은 탈출 할 필요가 없습니다.

>>> "Hello there"
'Hello there'
>>> "it's not its"
"it's not its"

다른 인용 스타일을 주목하십시오.

에 대해 repr(item.title[0:-1]) 파트, 어디에서 얻었는지 확실하지 않지만 단순히 사용할 수 있다고 확신합니다. item.title. 당신이하는 일은 문자열에서 마지막 숯을 제거한 다음 repr() 그것에, 아무것도하지 않습니다.

코드는 다음과 같이 보일 것입니다.

import geocoders # from GeoPy
us = geocoders.GeocoderDotUS()

import feedparser # from www.feedparser.org
feedurl = "http://www.tourfilter.com/dallas/rss/by_concert_date"
feed = feedparser.parse(feedurl)

lines = []
for entry in feed.entries:
    m = re.search(r'(.*) \((.*) (\d+/\d+)\)', entry.title)  
    if m:
        bandRaw, venue, date = m.groups()

        if band == bandRaw:
            place, (lat, lng) = us.geocode(venue + ", Dallas, TX")
            lines.append(",".join([band, venue, date, lat, lng]))

result = "\n".join(lines)

편집하다: 교체 list ~와 함께 lines var 이름으로. list 내장형이며 변수 이름으로 사용해서는 안됩니다. 죄송합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top