4

RSS 2.0 フィードのタイトル タグを、そのフィードのエントリごとに 3 つの異なる変数に解析しようとしています。ElementTree を使用して、RSS を既に解析したので、各タイトル [末尾のを除く)] を以下のコードで印刷できます。

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

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

これを含めているのは、ご覧のとおり、 item.title が repr() データ型であるためです。これについてはよくわかりません。

インタラクティブ ウィンドウの特定のrepr(item.title[0:-1]) printed は次のようになります。

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

item.titleユーザーがバンドを選択し、それぞれを 3 つの変数 (バンド、会場、日付にそれぞれ 1 つ... または配列か、わかりません...)に解析した後、バンドに関連するものだけを選択したいと考えています。選択されました。その後、ジオコーディングのために Google に送信されますが、それは別の話です。

いくつかの例を見てきましregexたが、それらについて読んでいますが、非常に複雑に思えます。それは...ですか?ここにいる誰かが、これをインテリジェントな方法で正確に行う方法について洞察を持っているのではないかと思いました。reモジュールを使用する必要がありますか? 出力が現在 s であることは重要repr()ですか? より良い方法はありますか?私は次のようなループを使用することを考えていました (これは私の pseudoPython であり、私が書いているメモのようなものです):

     list = bandRaw,venue,date,latLong  
     フィード内のアイテム:  
      bandRaw、会場、日付の item.title を解析します  
       if bandRaw == str(バンド)   
        会場名 + 「テキサス州ダラス」を Google に送信して、ジオコーディングを行います  
        緯度、経度を返す  
      リスト = リスト + リターン文字 + bandRaw + "," + 会場 + "," + 日付 + "," + lat + "," + ロング  
     そうしないと  

最後に、次のような .csv (カンマ区切り) ファイルに選択したエントリを含める必要があります。

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])feed3 つの個別の値に解析して、.csv ファイルに連結できるようにするにはどうすればよいかということです。

4

3 に答える 3

17

正規表現を怖がらせないでください...学習する価値は十分にあります。

上記の例を考えると、末尾の括弧を元に戻し、次のパターンを使用してみてください。

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"

この場合の正規表現の難しい点は、タイトルに含まれている可能性のあるすべての既知の文字を確実に把握することです。「Michael Schenker Group」部分に非アルファ文字がある場合は、その部分の正規表現を調整して許可する必要があります。

上記のパターンは次のように分解され、左から右に解析されます。

([\w\s]+): 任意の単語またはスペース文字に一致します (プラス記号は、そのような文字が 1 つ以上あることを示します)。括弧は、一致がグループとしてキャプチャされることを意味します。こちらは「マイケル・シェンカー・グループ」の部分。ここに数字とダッシュが含まれる可能性がある場合は、セットで使用可能な文字である角かっこの間の部分を変更する必要があります。

\(: リテラル括弧。バックスラッシュは、正規表現コマンドとしてカウントされるため、括弧をエスケープします。これは、文字列の「(」部分です。

([\w\s]+): 上記と同じですが、今回は "House of Blues Dallas" の部分に一致します。かっこで囲まれているため、2 番目のグループとしてキャプチャされます。

(\d+/\d+): 数字の 3 と 26 にスラッシュを付けて一致させます。括弧内は、3 番目のグループとしてキャプチャされるようにします。

\): 上記の閉じ括弧。

Python の正規表現の紹介は非常に優れているため、一晩かけてhttp://docs.python.org/library/re.html#module-reを読んでみるとよいでしょう。また、わかりやすい紹介がある Dive Into Python もチェックしてください: http://diveintopython3.ep.io/regular-expressions.html

編集: 以下の zacherates を参照してください。2 つの頭は 1 つよりも優れています!

于 2009-03-03T19:35:41.917 に答える
7

正規表現は、この問題に対する優れたソリューションです。

>>> 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')

余談ですが、RSS の解析を処理するためにUniversal Feed Parserを参照することをお勧めします。これは、フィードの形式が正しくないという悪い癖があるためです。

編集

あなたのコメントに関して...文字列が 's ではなく "s でラップされることがあるのは、repr を使用しているという事実に関係しています。文字列の repr は、文字列に 's が含まれていない限り、通常 's で区切られます。をエスケープする必要がないように、代わりに "s を使用します。

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

異なる引用スタイルに注意してください。

于 2009-03-03T19:35:51.947 に答える
0

パーツに関しては、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)

EDIT : 変数名として置き換えられlistますlineslist組み込みであり、変数名として使用しないでください。ごめん。

于 2009-03-03T20:22:36.750 に答える