from knock20 import open_england import re # 説明文込み # ptn = re.compile(r'\[\[(ファイル|File):(.*)\]\]') # リンクのみ ptn = re.compile(r'\[\[(ファイル|File):(.*)\|thumb.*\]\]') print('\n'.join( ptn.search(l).group(2) for l in open_england() if ptn.search(l))) # 24. ファイル参照の抽出 # 記事から参照されているメディアファイルをすべて抜き出せ.
from knock20 import open_england import re ptn = re.compile(r'\[\[Category:.*?\]\]') print(''.join(l for l in open_england() if ptn.search(l))) # 21. カテゴリ名を含む行を抽出 # 記事中でカテゴリ名を宣言している行を抽出せよ. # [[Category:イギリス|*]] # [[Category:英連邦王国|*]] # [[Category:G8加盟国]] # [[Category:欧州連合加盟国]] # [[Category:海洋国家]] # [[Category:君主国]] # [[Category:島国|くれいとふりてん]] # [[Category:1801年に設立された州・地域]]
from knock20 import open_england import re ptn = re.compile(r'\[\[Category:(.*)\]\]') print('\n'.join(ptn.search(l).group(1) for l in open_england() if ptn.search(l))) # 22. カテゴリ名の抽出 # 記事のカテゴリ名を(行単位ではなく名前で)抽出せよ. # イギリス|* # 英連邦王国|* # G8加盟国 # 欧州連合加盟国 # 海洋国家 # 君主国 # 島国|くれいとふりてん # 1801年に設立された州・地域
from knock20 import open_england from pprint import pprint import regex import urllib.parse import urllib.request import json # 再帰的な{}の正規表現パターン ptn1 = regex.compile(r'(?<rec>\{(?:[^{}]+|(?&rec))*\})') # 基礎情報のフィールド名と値にマッチする正規表現パターン ptn2 = regex.compile(r'\|(.*?) = (.*?)(?=\n(\||\}))', flags=(regex.M | regex.S)) data = open_england().read() for m in ptn1.finditer(data): if m.group('rec').startswith('{{基礎情報'): basic_info = m.group('rec') break category_dic = {} for m in ptn2.finditer(basic_info): value = m.group(2).replace("'''", '').replace("''", '') value = regex.sub(r'(\[\[(.*\|)*?(?P<d>[^|]*?)\]\])', r'\g<d>', value) value = regex.sub(r'(\{\{(.*\|)*?(?P<d>[^|]*?)\}\})', r'\g<d>', value) value = regex.sub(r'<br( *?/>|>)', '', value) value = regex.sub(r'<ref(.*?)(</ref>|/>)', '', value, flags=(regex.M | regex.S)) category_dic[m.group(1)] = value
from knock20 import open_england import re ptn = re.compile(r'(=(=+)(.*?)=\2)') print('\n'.join(f'{len(ptn.search(l).group(2))}\t{ptn.search(l).group(3)}' for l in open_england() if ptn.search(l))) # 23. セクション構造 # 記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ. # 1 国名 # 1 歴史 # 1 地理 # 2 気候 # 1 政治 # 1 外交と軍事 # 1 地方行政区分 # 2 主要都市 # 1 科学技術 # 1 経済 # 2 鉱業 # 2 農業 # 2 貿易 # 2 通貨 # 2 企業 # 1 交通 # 2 道路 # 2 鉄道 # 2 海運 # 2 航空