言語処理100本ノック 2020 第3章: 正規表現

先日，[言語処理100本ノック2020](https://nlp100.github.io/ja/)が公開されました．私自身，自然言語処理を初めてから1年しか経っておらず，細かいことはよくわかっていませんが，技術力向上のために全ての問題を解いて公開していこうと思います．

すべてjupyter notebook上で実行するものとし，問題文の制約は都合よく破っていいものとします．
ソースコードはgithubにもあります．[あります](https://github.com/nymwa/nlp100/blob/master/chapter03.ipynb)．

2章は[こちら](https://qiita.com/nymwa/items/138731ea30597036704e)．

環境はPython3.8.2とUbuntu18.04です．

# 第3章: 正規表現
> Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある．
> ・1行に1記事の情報がJSON形式で格納される
> ・各行には記事名が”title”キーに，記事本文が”text”キーの辞書オブジェクトに格納され，そのオブジェクトがJSON形式で書き出される
> ・ファイル全体はgzipで圧縮される
> 以下の処理を行うプログラムを作成せよ．

必要なデータセットは[ここ](https://nlp100.github.io/ja/ch03.html)からダウンロードしてください．

ダウンロードしたファイルは`data`以下に置くものとします．

## 20. JSONデータの読み込み
> Wikipedia記事のJSONファイルを読み込み，「イギリス」に関する記事本文を表示せよ．問題21-29では，ここで抽出した記事本文に対して実行せよ．

gzipの解凍とjsonの読み込みをするためのモジュールを読み込みます．

```python:コード
import gzip
import json
```

gzipファイルを行ごとに読み込んでいって，各行を`json.loads()`で辞書型に変換します．

```python:コード
data = []
with gzip.open('data/jawiki-country.json.gz', 'rt') as f:
    for line in f:
        line = line.strip()
        data.append(json.loads(line))
```

データの中からタイトルが「イギリス」になってる要素を見つけて，`text`に格納します．

```python:コード
for df in data:
    if df['title'] == 'イギリス':
        text = df['text']
        break
```

中身はこんな感じです

```textの先頭1000文字
{{redirect|UK}}
{{redirect|英国|春秋時代の諸侯国|英 (春秋)}}
{{Otheruses|ヨーロッパの国|長崎県・熊本県の郷土料理|いぎりす}}
{{基礎情報 国
|略名  =イギリス
|日本語国名 = グレートブリテン及び北アイルランド連合王国
|公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br />
*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}（[[スコットランド・ゲール語]]）
*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}（[[ウェールズ語]]）
*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}（[[アイルランド語]]）
*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}（[[コーンウォール語]]）
*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}（[[スコットランド語]]）
**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}（アルスター・スコットランド語）</ref>
|国旗画像 = Flag of the United Kingdom.svg
|国章画像 = [[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]
|国章リンク =（[[イギリスの国章|国章]]）
|標語 = {{lang|fr|[[Dieu et mon droit]]}}<br />（[[フランス語]]:[[Die
```

## 21. カテゴリ名を含む行を抽出
> 記事中でカテゴリ名を宣言している行を抽出せよ．

```python:コード
import re
```

```python:コード
lines = text.splitlines()
for line in lines:
    if re.search(r'\[\[Category:.*\]\]', line):
        print(line)
```

正規表現を使ってカテゴリ名を抽出します．`[[Category:ほげほげ]]`のようなパターンがマッチする行をすべて抽出します．

```text:出力
[[Category:イギリス|*]]
[[Category:イギリス連邦加盟国]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国|元]]
[[Category:海洋国家]]
[[Category:現存する君主国]]
[[Category:島国]]
[[Category:1801年に成立した国家・領域]]
```


## 22. カテゴリ名の抽出
> 記事のカテゴリ名を（行単位ではなく名前で）抽出せよ．

```python:コード
for line in lines:
    lst = re.findall(r'\[\[Category:(.*)\]\]', line)
    for category in lst:
        print(category)
```

マッチする部分列を`lst`に入れて，そのすべてを出力するようにしました．カテゴリ名を抽出できます．

```text:出力
イギリス|*
イギリス連邦加盟国
英連邦王国|*
G8加盟国
欧州連合加盟国|元
海洋国家
現存する君主国
島国
1801年に成立した国家・領域
```

## 23. セクション構造
> 記事中に含まれるセクション名とそのレベル（例えば”== セクション名 ==”なら1）を表示せよ．

```python:コード
for line in lines:
    if re.search(r'^==.*==$', line):
        level = len(re.match(r'^=*', line).group()) - 1
        title = re.sub(r'[=\s]', '', line)
        print(level, title)
```

`=セクション=`，`==セクション==`，`===セクション===`，......というようなパターンの行を抽出します．`=`の数でセクションのレベルを決めています．

```text:出力
1 国名
1 歴史
1 地理
2 主要都市
2 気候
1 政治
2 元首
2 法
2 内政
2 地方行政区分
2 外交・軍事
1 経済
2 鉱業
2 農業
2 貿易
2 不動産
2 エネルギー政策
2 通貨
2 企業
3 通信
1 交通
2 道路
2 鉄道
2 海運
2 航空
1 科学技術
1 国民
2 言語
2 宗教
2 婚姻
2 移住
2 教育
2 医療
1 文化
2 食文化
2 文学
2 哲学
2 音楽
3 ポピュラー音楽
2 映画
2 コメディ
2 国花
2 世界遺産
2 祝祭日
2 スポーツ
3 サッカー
3 クリケット
3 競馬
3 モータースポーツ
3 野球
3 カーリング
3 自転車競技
1 脚注
1 関連項目
1 外部リンク
```

以下のように後方参照を用いてもいいと思います．ちゃんと計測してませんが，より高速かと思います．
どちらの例が可読性が高いかは人によるという感じがあるし，わかりやすいほうならどちらでもいいように思います．

```python:コード
for line in lines:
    if x := re.match(r'^(==+)(.*)\1$', line):
        print(len(x[1])-1, x[2].strip())
```

セイウチ演算子を使ってみました

セクション"構造"っていうぐらいなので，`tree`コマンドみたいなやつを実装します．

```python:コード
def get_sections():
    return [
        (
            len(re.match(r'^=*', line).group()) - 1,
            re.sub(r'[=\s]', '', line)
        )
        for line in lines
        if re.search(r'^==.*==$', line)
    ]
```

まずは`lines`からセクションを取り出し，レベルとセクション名のリストにします．

```python:コード
class Section(list):
    def __init__(self, title):
        self.title = title
        super().__init__()
        
    def last(self):
        return self[-1]
    
    def add(self, level, title):
        if level == 1:
            self.append(Section(title))
        else:
            self[-1].add(level-1, title)
            
    def tree_lines(self, head):
        lines = []
        last = len(self) - 1
        for i, x in enumerate(self):
            line = head
            line += '└' if i == last else '├'
            line += x.title
            lines.append(line)
            lines += (x.tree_lines(head + ('　' if i == last else '│')))
        return lines
    
    def __repr__(self):
        return '\n'.join(self.tree_lines(''))
```

セクションを再帰的に保持するオブジェクトのクラスを作ります．レベル1のセクションのオブジェクトはリスト型を継承していて，レベル2のセクションを自分の中に保持できます．

```python:コード
root = Section('root')
for level, title in get_sections():
    root.add(level, title)
root
```

`get_sections()`で得たセクションのリストを根のセクションから`add`メソッドを使って再帰的に入れていきます．
`__repr__`メソッドから再帰的に文字列に変換するようにしています．


```text:出力
├国名
├歴史
├地理
│├主要都市
│└気候
├政治
│├元首
│├法
│├内政
│├地方行政区分
│└外交・軍事
├経済
│├鉱業
│├農業
│├貿易
│├不動産
│├エネルギー政策
│├通貨
│└企業
│　└通信
├交通
│├道路
│├鉄道
│├海運
│└航空
├科学技術
├国民
│├言語
│├宗教
│├婚姻
│├移住
│├教育
│└医療
├文化
│├食文化
│├文学
│├哲学
│├音楽
││└ポピュラー音楽
│├映画
│├コメディ
│├国花
│├世界遺産
│├祝祭日
│└スポーツ
│　├サッカー
│　├クリケット
│　├競馬
│　├モータースポーツ
│　├野球
│　├カーリング
│　└自転車競技
├脚注
├関連項目
└外部リンク
```

スポーツ以下のところでは同じ親セクションを持つレベル2のセクションがないため，罫線が表示されていません．子セクションのうち最後のセクションだけは，タイトルの前に表示する罫線を変えることでこれを実装しています．

## 24. ファイル参照の抽出
> 記事から参照されているメディアファイルをすべて抜き出せ．

```python:コード
for line in lines:
    lst = re.findall(r'\[\[ファイル:([^|\]]*)', line)
    for x in lst:
        print(x)
```

`[[ファイル:なんとか]]`にマッチする「なんとか」の部分を抜き出してます．

```text:出力
Royal Coat of Arms of the United Kingdom.svg
United States Navy Band - God Save the Queen.ogg
Descriptio Prime Tabulae Europae.jpg
Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg
London.bankofengland.arp.jpg
Battle of Waterloo 1815.PNG
Uk topo en.jpg
BenNevis2005.jpg
Population density UK 2011 census.png
2019 Greenwich Peninsula & Canary Wharf.jpg
Birmingham Skyline from Edgbaston Cricket Ground crop.jpg
Leeds CBD at night.jpg
Glasgow and the Clyde from the air (geograph 4665720).jpg
Palace of Westminster, London - Feb 2007.jpg
Scotland Parliament Holyrood.jpg
Donald Trump and Theresa May (33998675310) (cropped).jpg
Soldiers Trooping the Colour, 16th June 2007.jpg
City of London skyline from London City Hall - Oct 2008.jpg
Oil platform in the North SeaPros.jpg
Eurostar at St Pancras Jan 2008.jpg
Heathrow Terminal 5C Iwelumo-1.jpg
Airbus A380-841 G-XLEB British Airways (10424102995).jpg
UKpop.svg
Anglospeak.svg
Royal Aberdeen Children's Hospital.jpg
CHANDOS3.jpg
The Fabs.JPG
Wembley Stadium, illuminated.jpg
```

## 25. テンプレートの抽出
> 記事中に含まれる「基礎情報」テンプレートのフィールド名と値を抽出し，辞書オブジェクトとして格納せよ．

```python:コード
for i, line in enumerate(lines):
    if line.startswith('{{基礎情報'):
        start = i
    elif line.startswith('}}'):
        end = i
        break
```

本当は正規言語の枠組みを超えているので．マークダウン用のパーサかなにかを使うのが望ましい気がしますが，基礎情報の行の範囲を特定します．

```python:コード
templete = [
    re.findall(r'\|([^=]*)=(.*)', line)
    for line in lines[start+1 : end]
]
templete = [x[0] for x in templete if x]
dct = {
    key.strip() : value.strip()
    for key, value in templete
}
dct
```

内容を辞書に格納します．

```text:出力
{'略名': 'イギリス',
 '日本語国名': 'グレートブリテン及び北アイルランド連合王国',
 '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br />',
 '国旗画像': 'Flag of the United Kingdom.svg',
 '国章画像': '[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]',
 '国章リンク': '（[[イギリスの国章|国章]]）',
 '標語': '{{lang|fr|[[Dieu et mon droit]]}}<br />（[[フランス語]]:[[Dieu et mon droit|神と我が権利]]）',
 '国歌': "[[女王陛下万歳|{{lang|en|God Save the Queen}}]]{{en icon}}<br />''神よ女王を護り賜え''<br />{{center|[[ファイル:United States Navy Band - God Save the Queen.ogg]]}}",
 '地図画像': 'Europe-UK.svg',
 '位置画像': 'United Kingdom (+overseas territories) in the World (+Antarctica claims).svg',
 '公用語': '[[英語]]',
 '首都': '[[ロンドン]]（事実上）',
 '最大都市': 'ロンドン',
 '元首等肩書': '[[イギリスの君主|女王]]',
 '元首等氏名': '[[エリザベス2世]]',
 '首相等肩書': '[[イギリスの首相|首相]]',
 '首相等氏名': '[[ボリス・ジョンソン]]',
 '他元首等肩書1': '[[貴族院 (イギリス)|貴族院議長]]',
 '他元首等氏名1': '[[:en:Norman Fowler, Baron Fowler|ノーマン・ファウラー]]',
 '他元首等肩書2': '[[庶民院 (イギリス)|庶民院議長]]',
 '他元首等氏名2': '{{仮リンク|リンゼイ・ホイル|en|Lindsay Hoyle}}',
 '他元首等肩書3': '[[連合王国最高裁判所|最高裁判所長官]]',
 '他元首等氏名3': '[[:en:Brenda Hale, Baroness Hale of Richmond|ブレンダ・ヘイル]]',
 '面積順位': '76',
 '面積大きさ': '1 E11',
 '面積値': '244,820',
 '水面積率': '1.3%',
 '人口統計年': '2018',
 '人口順位': '22',
 '人口大きさ': '1 E7',
 '人口値': '6643万5600<ref>{{Cite web|url=https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates|title=Population estimates - Office for National Statistics|accessdate=2019-06-26|date=2019-06-26}}</ref>',
 '人口密度値': '271',
 'GDP統計年元': '2012',
 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a=IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>',
 'GDP統計年MER': '2012',
 'GDP順位MER': '6',
 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />',
 'GDP統計年': '2012',
 'GDP順位': '6',
 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />',
 'GDP/人': '36,727<ref name="imf-statistics-gdp" />',
 '建国形態': '建国',
 '確立形態1': '[[イングランド王国]]／[[スコットランド王国]]<br />（両国とも[[合同法 (1707年)|1707年合同法]]まで）',
 '確立年月日1': '927年／843年',
 '確立形態2': '[[グレートブリテン王国]]成立<br />（1707年合同法）',
 '確立年月日2': '1707年{{0}}5月{{0}}1日',
 '確立形態3': '[[グレートブリテン及びアイルランド連合王国]]成立<br />（[[合同法 (1800年)|1800年合同法]]）',
 '確立年月日3': '1801年{{0}}1月{{0}}1日',
 '確立形態4': "現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更",
 '確立年月日4': '1927年{{0}}4月12日',
 '通貨': '[[スターリング・ポンド|UKポンド]] (£)',
 '通貨コード': 'GBP',
 '時間帯': '±0',
 '夏時間': '+1',
 'ISO 3166-1': 'GB / GBR',
 'ccTLD': '[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>',
 '国際電話番号': '44',
 '注記': '<references/>'}
```

## 26. 強調マークアップの除去
> 25の処理時に，テンプレートの値からMediaWikiの強調マークアップ（弱い強調，強調，強い強調のすべて）を除去してテキストに変換せよ．

```python:コード
dct2 = {
    key : re.sub(r"''+", '', value)
    for key, value in dct.items()
}
dct2
```

```text:結果
{'略名': 'イギリス',
 '日本語国名': 'グレートブリテン及び北アイルランド連合王国',
 '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br />',
 '国旗画像': 'Flag of the United Kingdom.svg',
 '国章画像': '[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]',
 '国章リンク': '（[[イギリスの国章|国章]]）',
 '標語': '{{lang|fr|[[Dieu et mon droit]]}}<br />（[[フランス語]]:[[Dieu et mon droit|神と我が権利]]）',
 '国歌': '[[女王陛下万歳|{{lang|en|God Save the Queen}}]]{{en icon}}<br />神よ女王を護り賜え<br />{{center|[[ファイル:United States Navy Band - God Save the Queen.ogg]]}}',
 '地図画像': 'Europe-UK.svg',
 '位置画像': 'United Kingdom (+overseas territories) in the World (+Antarctica claims).svg',
 '公用語': '[[英語]]',
 '首都': '[[ロンドン]]（事実上）',
 '最大都市': 'ロンドン',
 '元首等肩書': '[[イギリスの君主|女王]]',
 '元首等氏名': '[[エリザベス2世]]',
 '首相等肩書': '[[イギリスの首相|首相]]',
 '首相等氏名': '[[ボリス・ジョンソン]]',
 '他元首等肩書1': '[[貴族院 (イギリス)|貴族院議長]]',
 '他元首等氏名1': '[[:en:Norman Fowler, Baron Fowler|ノーマン・ファウラー]]',
 '他元首等肩書2': '[[庶民院 (イギリス)|庶民院議長]]',
 '他元首等氏名2': '{{仮リンク|リンゼイ・ホイル|en|Lindsay Hoyle}}',
 '他元首等肩書3': '[[連合王国最高裁判所|最高裁判所長官]]',
 '他元首等氏名3': '[[:en:Brenda Hale, Baroness Hale of Richmond|ブレンダ・ヘイル]]',
 '面積順位': '76',
 '面積大きさ': '1 E11',
 '面積値': '244,820',
 '水面積率': '1.3%',
 '人口統計年': '2018',
 '人口順位': '22',
 '人口大きさ': '1 E7',
 '人口値': '6643万5600<ref>{{Cite web|url=https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates|title=Population estimates - Office for National Statistics|accessdate=2019-06-26|date=2019-06-26}}</ref>',
 '人口密度値': '271',
 'GDP統計年元': '2012',
 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a=IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>',
 'GDP統計年MER': '2012',
 'GDP順位MER': '6',
 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />',
 'GDP統計年': '2012',
 'GDP順位': '6',
 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />',
 'GDP/人': '36,727<ref name="imf-statistics-gdp" />',
 '建国形態': '建国',
 '確立形態1': '[[イングランド王国]]／[[スコットランド王国]]<br />（両国とも[[合同法 (1707年)|1707年合同法]]まで）',
 '確立年月日1': '927年／843年',
 '確立形態2': '[[グレートブリテン王国]]成立<br />（1707年合同法）',
 '確立年月日2': '1707年{{0}}5月{{0}}1日',
 '確立形態3': '[[グレートブリテン及びアイルランド連合王国]]成立<br />（[[合同法 (1800年)|1800年合同法]]）',
 '確立年月日3': '1801年{{0}}1月{{0}}1日',
 '確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更',
 '確立年月日4': '1927年{{0}}4月12日',
 '通貨': '[[スターリング・ポンド|UKポンド]] (£)',
 '通貨コード': 'GBP',
 '時間帯': '±0',
 '夏時間': '+1',
 'ISO 3166-1': 'GB / GBR',
 'ccTLD': '[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>',
 '国際電話番号': '44',
 '注記': '<references/>'}
```

## 27. 内部リンクの除去
> 26の処理に加えて，テンプレートの値からMediaWikiの内部リンクマークアップを除去し，テキストに変換せよ．

```python:コード
def remove_link(x):
    x = re.sub(r'\[\[[^\|\]]+\|[^{}\|\]]+\|([^\]]+)\]\]', r'\1', x)
    x = re.sub(r'\[\[[^\|\]]+\|([^\]]+)\]\]', r'\1', x)
    x = re.sub(r'\[\[([^\]]+)\]\]', r'\1', x)
    return x

dct3 = {
    key : remove_link(value)
    for key, value in dct2.items()
}
dct3
```


```text:出力
{'略名': 'イギリス',
 '日本語国名': 'グレートブリテン及び北アイルランド連合王国',
 '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br />',
 '国旗画像': 'Flag of the United Kingdom.svg',
 '国章画像': 'イギリスの国章',
 '国章リンク': '（国章）',
 '標語': '{{lang|fr|Dieu et mon droit}}<br />（フランス語:神と我が権利）',
 '国歌': '{{lang|en|God Save the Queen}}{{en icon}}<br />神よ女王を護り賜え<br />{{center|ファイル:United States Navy Band - God Save the Queen.ogg}}',
 '地図画像': 'Europe-UK.svg',
 '位置画像': 'United Kingdom (+overseas territories) in the World (+Antarctica claims).svg',
 '公用語': '英語',
 '首都': 'ロンドン（事実上）',
 '最大都市': 'ロンドン',
 '元首等肩書': '女王',
 '元首等氏名': 'エリザベス2世',
 '首相等肩書': '首相',
 '首相等氏名': 'ボリス・ジョンソン',
 '他元首等肩書1': '貴族院議長',
 '他元首等氏名1': 'ノーマン・ファウラー',
 '他元首等肩書2': '庶民院議長',
 '他元首等氏名2': '{{仮リンク|リンゼイ・ホイル|en|Lindsay Hoyle}}',
 '他元首等肩書3': '最高裁判所長官',
 '他元首等氏名3': 'ブレンダ・ヘイル',
 '面積順位': '76',
 '面積大きさ': '1 E11',
 '面積値': '244,820',
 '水面積率': '1.3%',
 '人口統計年': '2018',
 '人口順位': '22',
 '人口大きさ': '1 E7',
 '人口値': '6643万5600<ref>{{Cite web|url=https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates|title=Population estimates - Office for National Statistics|accessdate=2019-06-26|date=2019-06-26}}</ref>',
 '人口密度値': '271',
 'GDP統計年元': '2012',
 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a=IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>',
 'GDP統計年MER': '2012',
 'GDP順位MER': '6',
 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />',
 'GDP統計年': '2012',
 'GDP順位': '6',
 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />',
 'GDP/人': '36,727<ref name="imf-statistics-gdp" />',
 '建国形態': '建国',
 '確立形態1': 'イングランド王国／スコットランド王国<br />（両国とも1707年合同法まで）',
 '確立年月日1': '927年／843年',
 '確立形態2': 'グレートブリテン王国成立<br />（1707年合同法）',
 '確立年月日2': '1707年{{0}}5月{{0}}1日',
 '確立形態3': 'グレートブリテン及びアイルランド連合王国成立<br />（1800年合同法）',
 '確立年月日3': '1801年{{0}}1月{{0}}1日',
 '確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更',
 '確立年月日4': '1927年{{0}}4月12日',
 '通貨': 'UKポンド (£)',
 '通貨コード': 'GBP',
 '時間帯': '±0',
 '夏時間': '+1',
 'ISO 3166-1': 'GB / GBR',
 'ccTLD': '.uk / .gb<ref>使用は.ukに比べ圧倒的少数。</ref>',
 '国際電話番号': '44',
 '注記': '<references/>'}
```

## 28. MediaWikiマークアップの除去
> 27の処理に加えて，テンプレートの値からMediaWikiマークアップを可能な限り除去し，国の基本情報を整形せよ．

MediaWikiマークアップ以外の不要な部分も一緒に取り除きました．

```python:コード
def remove_markups(x):
    x = re.sub(r'{{.*\|.*\|([^}]*)}}', r'\1', x)
    x = re.sub(r'<([^>]*)( .*|)>.*</\1>', '', x)
    x = re.sub(r'<[^>]*?/>', '', x)
    x = re.sub(r'\{\{0\}\}', '', x)
    return x

dct4 = {
    key : remove_markups(value)
    for key, value in dct3.items()
}
dct4
```

```text:出力
{'略名': 'イギリス',
 '日本語国名': 'グレートブリテン及び北アイルランド連合王国',
 '公式国名': 'United Kingdom of Great Britain and Northern Ireland<ref>英語以外での正式国名:',
 '国旗画像': 'Flag of the United Kingdom.svg',
 '国章画像': 'イギリスの国章',
 '国章リンク': '（国章）',
 '標語': 'Dieu et mon droit（フランス語:神と我が権利）',
 '国歌': 'ファイル:United States Navy Band - God Save the Queen.ogg',
 '地図画像': 'Europe-UK.svg',
 '位置画像': 'United Kingdom (+overseas territories) in the World (+Antarctica claims).svg',
 '公用語': '英語',
 '首都': 'ロンドン（事実上）',
 '最大都市': 'ロンドン',
 '元首等肩書': '女王',
 '元首等氏名': 'エリザベス2世',
 '首相等肩書': '首相',
 '首相等氏名': 'ボリス・ジョンソン',
 '他元首等肩書1': '貴族院議長',
 '他元首等氏名1': 'ノーマン・ファウラー',
 '他元首等肩書2': '庶民院議長',
 '他元首等氏名2': 'Lindsay Hoyle',
 '他元首等肩書3': '最高裁判所長官',
 '他元首等氏名3': 'ブレンダ・ヘイル',
 '面積順位': '76',
 '面積大きさ': '1 E11',
 '面積値': '244,820',
 '水面積率': '1.3%',
 '人口統計年': '2018',
 '人口順位': '22',
 '人口大きさ': '1 E7',
 '人口値': '6643万5600',
 '人口密度値': '271',
 'GDP統計年元': '2012',
 'GDP値元': '1兆5478億',
 'GDP統計年MER': '2012',
 'GDP順位MER': '6',
 'GDP値MER': '2兆4337億',
 'GDP統計年': '2012',
 'GDP順位': '6',
 'GDP値': '2兆3162億',
 'GDP/人': '36,727',
 '建国形態': '建国',
 '確立形態1': 'イングランド王国／スコットランド王国（両国とも1707年合同法まで）',
 '確立年月日1': '927年／843年',
 '確立形態2': 'グレートブリテン王国成立（1707年合同法）',
 '確立年月日2': '1707年5月1日',
 '確立形態3': 'グレートブリテン及びアイルランド連合王国成立（1800年合同法）',
 '確立年月日3': '1801年1月1日',
 '確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更',
 '確立年月日4': '1927年4月12日',
 '通貨': 'UKポンド (£)',
 '通貨コード': 'GBP',
 '時間帯': '±0',
 '夏時間': '+1',
 'ISO 3166-1': 'GB / GBR',
 'ccTLD': '.uk / .gb',
 '国際電話番号': '44',
 '注記': ''}
```


## 29. 国旗画像のURLを取得する
> テンプレートの内容を利用し，国旗画像のURLを取得せよ．

```python:コード
import requests
```

requestsを使ってAPIを叩いて行きます．[ここ](https://www.mediawiki.org/wiki/API:Imageinfo)の下の方にあるコードを参考にしました．

```python:コード
filename = dct4['国旗画像']

session = requests.Session()
url = 'https://en.wikipedia.org/w/api.php'
params = {
    'action' : 'query',
    'format' : 'json',
    'prop' : 'imageinfo',
    'titles' : 'File:' + filename,
    'iiprop' : 'url',
}
r = session.get(url=url, params=params)
data = r.json()
pages = data['query']['pages']
flag_url = pages[list(pages)[0]]['imageinfo'][0]['url']
flag_url
```

```text:出力
'https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg'
```

リンクは下の画像です．
<img src="https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg", width="300">

## 次は第4章

[言語処理100本ノック 2020 第4章: 形態素解析](https://qiita.com/nymwa/items/447211c40dc657132c91)