第2章↓↓
第3章:正規表現
20.JSONデータの読み込み(21日目|8月25日)
Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.
今回与えられたデータはよく見るJSONと少し形式が異なります。一行ずつ読み込む必要があるのでfor文で1行ずつ読み込みます。そのタイトルがイギリスであるテキストを出力します。
21.カテゴリ名を含む行を抽出(22日目|8月26日)
記事中でカテゴリ名を宣言している行を抽出せよ.
カテゴリを宣言している行は"Catedory:〇〇"という形になっています。[]は正規表現で用いられる記号なので\でエスケープします。そしてCategory:の後は任意の文字がくるので.*とします。pythonで正規表現を用いる時はreモジュールをインポートします。findall()に正規表現と対象データと複数行にマッチさせるためにre.MULTILINEを引数として渡します。
22.カテゴリ名の抽出(23日目|8月27日)
記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.
21で抽出したもののうち、":"以降であり、"|*"より前まで抽出したいです。前者は簡単なのですが、後者をどのようにすれば良いのかわかりませんでした。調べた結果、(?:pattern)とすることでそのpatternをマッチした場合、抽出しないことができるそうです。正規表現だけ用いる必要がないならば"|"をreplace()したりすることで実装可能です。
23.セクション構造(24日目|8月28日)
記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.
セクションのレベル?はよくわからないのですが、おそらく"=="の長さ-1がレベルなんでしょう。["=の部分","セクション名","=の部分"]のような形でリストに格納します。[^pattern]はpattern以外のものにマッチします。
24.ファイル参照の抽出(25日目|8月29日)
記事から参照されているメディアファイルをすべて抜き出せ.
参照されているファイルは"ファイルorFile"の後にファイル名が指定されます。そこを指定して抽出します。
25. テンプレートの抽出(26日目|8月30日)
記事中に含まれる「基礎情報」テンプレートのフィールド名と値を抽出し,辞書オブジェクトとして格納せよ.
基礎情報のフィールド名と値は、「|"フィールド名""任意の空白文字"="任意の空白文字""値"」となっています。なのでそれを抽出する正規表現をpatternマッチさせます。\sは任意の空白文字です。それを辞書型に保存します。
26.強調マークアップの除去(27日目|8月31日)
25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)を除去してテキストに変換せよ(参考: マークアップ早見表).
指定されたマークアップ早見表を見てみると、強調には「'」が使われています。この数によって強調の度合いが変わりますが、2~5個であるため25のresultに正規表現で指定して削除します。\で'をエスケープし、{n,m}でその数を指定します。それをsub()関数で削除します。
27.内部リンクの削除(28日目|9月1日)
26の処理に加えて,テンプレートの値からMediaWikiの内部リンクマークアップを除去し,テキストに変換せよ(参考: マークアップ早見表).
(内部リンクは内部リンク|表示名となっているのでそれを削除すればいいのだがよくわからなかった)
28.MediaWikiマークアップの削除(29日目|9月2日)
27で内部リンクは削除できた(?)ので残りの部分の気になるところを削除します。<br>等のhtmlタグを削除しました。
29.国旗画像のURLを取得する(30日目|9月3日)
テンプレートの内容を利用し,国旗画像のURLを取得せよ.(ヒント: MediaWiki APIのimageinfoを呼び出して,ファイル参照をURLに変換すればよい)
WikiのAPIを使って画像urlを取得します。APIの説明は以下のページから
Pythonでのサンプルコードもあるので利用します。サンプルでpropはimageinfoが指定されているためそこからさらに画像urlを指定するにはiipopでurlを指定するだけです。結果をjsonで受け取り構造を確認してurlを出力します。
これで第3章は終わりです。お疲れ様でした。