LoginSignup
5
2

More than 3 years have passed since last update.

Julia で言語処理100本ノック打ってみた 第3章

Last updated at Posted at 2019-07-14

前回、Juliaで自然言語処理100本ノックを1章だけやりました。今回はその続きです。

※ 前回記事の最後に「Uniprotデータベースのちょっとした調査を……」と書いていますが、あれは嘘になりました。いつかは載せます。

続き(第4章)はこちらから。

言語処理100本ノック 第3章

Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある.

1行に1記事の情報がJSON形式で格納される
各行には記事名が"title"キーに,記事本文が"text"キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される
ファイル全体はgzipで圧縮される
以下の処理を行うプログラムを作成せよ.

準備

using JSON
wikidata = open("./100nock/jawiki-country.json", "r")

本番

21-25 は、最初にやった方法が愚かっぽい感じでして……
あとでもっと良い方法を思いついたので、そっちは別解集みたいな形で後ろに載せました。

20. JSONデータの読み込み

#########################################################################
#    20. JSONデータの読み込み
#    Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.
#    問題21-29では,ここで抽出した記事本文に対して実行せよ.
#########################################################################
seek(wikidata, 0)
eng_text = ""
for l in eachline(wikidata)
    entry = JSON.parse(l)
    ent_title = entry["title"]
    ent_text = entry["text"]
    if (ent_title == "イギリス")
        print(ent_text)
        eng_text *= ent_text
    end
end
{{redirect|UK}}
{{基礎情報 国
|略名 = イギリス
|日本語国名 = グレートブリテン及び北アイルランド連合王国
|公式国名 = {{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}}([[スコットランド・ゲール語]])<br/>
*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>
*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]])<br/>
*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]])<br/>
*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]])<br/>
**{{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

......


{{デフォルトソート:いきりす}}
[[Category:イギリス|*]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国]]
[[Category:海洋国家]]
[[Category:君主国]]
[[Category:島国|くれいとふりてん]]
[[Category:1801年に設立された州・地域]]

21. カテゴリ名を含む行を抽出

####################################################
# 21. カテゴリ名を含む行を抽出
# 記事中でカテゴリ名を宣言している行を抽出せよ
####################################################
eng_list = split(eng_text, "\n")
cate_line = []
for l in eng_list
    if occursin(r"\[\[Category:", l)
        println(l)
        push!(cate_line, l)
    end
end

[[Category:イギリス|*]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国]]
[[Category:海洋国家]]
[[Category:君主国]]
[[Category:島国|くれいとふりてん]]
[[Category:1801年に設立された州・地域]]

22. カテゴリ名の抽出

##################################################
# 22. カテゴリ名の抽出
# 記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.
##################################################
cate_name = []
for c in cate_line
    m = match(r"\[\[Category:([^\W]+).*\]\]", c)
    push!(cate_name, pop!(m.captures))
end    
println(cate_name)
Any["イギリス", "英連邦王国", "G8加盟国", "欧州連合加盟国", "海洋国家", "君主国", "島国", "1801年に設立された州"]

23. セクション構造

###############################################################################
# 23. セクション構造
# 記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ
###############################################################################
sections = []

for l in eng_list
    m = match(r"(==+) *([^=]+)", l)
    if m !== nothing
        name = m.captures[2]
        mm = eachmatch(r"=", m.match)
        level = length(collect(mm))
        push!(sections, [name, level])
    end
end

# print
for s in sections
    println("$(s[1])  : $(s[2])")
end
国名  : 2
歴史  : 2
地理  : 2
気候  : 3
政治  : 2
言語  : 3
......
競馬  : 3
モータースポーツ  : 3
脚注  : 2
関連項目  : 2
外部リンク  : 2

24. ファイル参照の抽出

####################################################
# 24. ファイル参照の抽出
# 記事から参照されているメディアファイルをすべて抜き出せ.
####################################################
cnt = 0
for l in eng_list
    m = match(r"(ファイル|File):.*?([^\s]+\.\w+)[^\w/\.]", l)
    if m !== nothing
        println(m.captures[2])
        cnt += 1
    end
end
println(cnt)
Kingdom.svg
1815.PNG
Empire.png
en.jpg
BenNevis2005.jpg
edit.jpg
2007.jpg
Toronto.jpg
2007.jpg
Holyrood.jpg
London.bankofengland.arp.jpg
2008.jpg
SeaPros.jpg
2008.jpg
T5.jpg
Anglospeak.svg
CHANDOS3.jpg
Fabs.JPG
PalaceOfWestminsterAtNight.jpg
Door.jpg
dsc06789.jpg
Cross-spire.jpeg
2009.jpg
Greenwich.jpg
30.jpg
Yard2.jpg
Nahaufnahme.jpg
2006.jpg
2005-08-27.jpg
3673.JPG
night.jpg
Greenhead.jpg
(1).JPG
illuminated.jpg
34

25. テンプレートの抽出

######################################################################################
# 25. テンプレートの抽出
# 記事中に含まれる「基礎情報」テンプレートのフィールド名と値を抽出し,辞書オブジェクトとして格納せよ.
######################################################################################
# ここにきて、改行区切りアダとなる……後ろに別解(というかもっといい解答と思われるもの)を掲載しているが、
# ここでは、意地でもこの方針でいってみる。
# make new list
basic_info = Dict()
pipe_delim_txt = split(eng_text, r"(\n\||\n\}\})")
for l in pipe_delim_txt
    if occursin(r".+ = .+", l)
        field, val = split(l, " = ")
        basic_info[field] = val
    end
end
print(basic_info)
Dict{Any,Any}("国際電話番号"=>"44","国章画像"=>"[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]","元首等氏名"=>"[[エリザベス2世]]","人口順位"=>"22","確立形態4"=>"現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更","国旗画像"=>"Flag of the United Kingdom.svg","時間帯"=>"±0","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>","水面積率"=>"1.3%","人口大きさ"=>"1 E7","人口値"=>"63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>","通貨"=>"[[スターリング・ポンド|UKポンド]] (&pound;)","確立年月日3"=>"[[1801年]]","国章リンク"=>"([[イギリスの国章|国章]])","確立形態3"=>"[[グレートブリテン及びアイルランド連合王国]]建国<br />([[連合法 (1800年)|1800年連合法]])","標語"=>"{{lang|fr|Dieu et mon droit}}<br/>([[フランス語]]:神と私の権利)","元首等肩書"=>"[[イギリスの君主|女王]]","建国形態"=>"建国","通貨コード"=>"GBP","日本語国名"=>"グレートブリテン及び北アイルランド連合王国","首相等肩書"=>"[[イギリスの首相|首相]]","最大都市"=>"ロンドン","GDP値MER"=>"2兆4337億<ref name=\"imf-statistics-gdp\" />","面積値"=>"244,820","GDP値"=>"2兆3162億<ref name=\"imf-statistics-gdp\" />","確立年月日1"=>"[[927年]]/[[843年]]","夏時間"=>"+1","GDP/人"=>"36,727<ref name=\"imf-statistics-gdp\" />","位置画像"=>"Location_UK_EU_Europe_001.svg","略名"=>"イギリス","面積順位"=>"76","GDP順位MER"=>"5","人口密度値"=>"246","確立年月日2"=>"[[1707年]]","首都"=>"[[ロンドン]]","公式国名"=>"{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]])<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]])<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]])<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]])<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>","GDP統計年元"=>"2012","ccTLD"=>"[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>","ISO 3166-1"=>"GB / GBR","確立年月日4"=>"[[1927年]]","首相等氏名"=>"[[デーヴィッド・キャメロン]]","面積大きさ"=>"1 E11","公用語"=>"[[英語]](事実上)","GDP統計年MER"=>"2012","GDP統計年"=>"2012","注記"=>"<references />","確立形態1"=>"[[イングランド王国]]/[[スコットランド王国]]<br />(両国とも[[連合法 (1707年)|1707年連合法]]まで)","GDP順位"=>"6","国歌"=>"[[女王陛下万歳|神よ女王陛下を守り給え]]","人口統計年"=>"2011","確立形態2"=>"[[グレートブリテン王国]]建国<br />([[連合法 (1707年)|1707年連合法]])")

26. 強調マークアップの除去

#####################################################################################
# 26. 強調マークアップの除去
# 25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)
# を除去してテキストに変換せよ(参考: マークアップ早見表).https://ja.wikipedia.org/wiki/Help:%E6%97%A9%E8%A6%8B%E8%A1%A8
#####################################################################################
f(s) = replace(s, r"'+(.+?)'+" => s"\1")
basic_info_mod1 = Dict(k => f(basic_info[k]) for k in keys(basic_info))
print(basic_info_mod1)
Dict("国際電話番号"=>"44","国章画像"=>"[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]","元首等氏名"=>"[[エリザベス2世]]","人口順位"=>"22","確立形態4"=>"現在の国号「グレートブリテン及び北アイルランド連合王国」に変更","国旗画像"=>"Flag of the United Kingdom.svg","時間帯"=>"±0","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>","水面積率"=>"1.3%","人口大きさ"=>"1 E7","人口値"=>"63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>","通貨"=>"[[スターリング・ポンド|UKポンド]] (&pound;)","確立年月日3"=>"[[1801年]]","国章リンク"=>"([[イギリスの国章|国章]])","確立形態3"=>"[[グレートブリテン及びアイルランド連合王国]]建国<br />([[連合法 (1800年)|1800年連合法]])","標語"=>"{{lang|fr|Dieu et mon droit}}<br/>([[フランス語]]:神と私の権利)","元首等肩書"=>"[[イギリスの君主|女王]]","建国形態"=>"建国","通貨コード"=>"GBP","日本語国名"=>"グレートブリテン及び北アイルランド連合王国","首相等肩書"=>"[[イギリスの首相|首相]]","最大都市"=>"ロンドン","GDP値MER"=>"2兆4337億<ref name=\"imf-statistics-gdp\" />","面積値"=>"244,820","GDP値"=>"2兆3162億<ref name=\"imf-statistics-gdp\" />","確立年月日1"=>"[[927年]]/[[843年]]","夏時間"=>"+1","GDP/人"=>"36,727<ref name=\"imf-statistics-gdp\" />","位置画像"=>"Location_UK_EU_Europe_001.svg","略名"=>"イギリス","面積順位"=>"76","GDP順位MER"=>"5","人口密度値"=>"246","確立年月日2"=>"[[1707年]]","首都"=>"[[ロンドン]]","公式国名"=>"{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]])<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]])<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]])<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]])<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>","GDP統計年元"=>"2012","ccTLD"=>"[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>","ISO 3166-1"=>"GB / GBR","確立年月日4"=>"[[1927年]]","首相等氏名"=>"[[デーヴィッド・キャメロン]]","面積大きさ"=>"1 E11","公用語"=>"[[英語]](事実上)","GDP統計年MER"=>"2012","GDP統計年"=>"2012","注記"=>"<references />","確立形態1"=>"[[イングランド王国]]/[[スコットランド王国]]<br />(両国とも[[連合法 (1707年)|1707年連合法]]まで)","GDP順位"=>"6","国歌"=>"[[女王陛下万歳|神よ女王陛下を守り給え]]","人口統計年"=>"2011","確立形態2"=>"[[グレートブリテン王国]]建国<br />([[連合法 (1707年)|1707年連合法]])")

27. 内部リンクの除去

##########################################################################
# 27. 内部リンクの除去
# 26の処理に加えて,テンプレートの値からMediaWikiの内部リンクマークアップを除去し,
# テキストに変換せよ(参考: マークアップ早見表).
##########################################################################
g(s) = replace( s, r"(?:\[\[(?:[^\[\]]+\|)?|\]\])" => s"")
basic_info_mod2 = Dict(k => g(basic_info_mod1[k]) for k in keys(basic_info_mod1))
print(basic_info_mod2)
Dict("国際電話番号"=>"44","国章画像"=>"イギリスの国章","元首等氏名"=>"エリザベス2世","人口順位"=>"22","確立形態4"=>"現在の国号「グレートブリテン及び北アイルランド連合王国」に変更","国旗画像"=>"Flag of the United Kingdom.svg","時間帯"=>"±0","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>","水面積率"=>"1.3%","人口大きさ"=>"1 E7","人口値"=>"63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>","通貨"=>"UKポンド (&pound;)","確立年月日3"=>"1801年","国章リンク"=>"(国章)","確立形態3"=>"グレートブリテン及びアイルランド連合王国建国<br />(1800年連合法)","標語"=>"{{lang|fr|Dieu et mon droit}}<br/>(フランス語:神と私の権利)","元首等肩書"=>"女王","建国形態"=>"建国","通貨コード"=>"GBP","日本語国名"=>"グレートブリテン及び北アイルランド連合王国","首相等肩書"=>"首相","最大都市"=>"ロンドン","GDP値MER"=>"2兆4337億<ref name=\"imf-statistics-gdp\" />","面積値"=>"244,820","GDP値"=>"2兆3162億<ref name=\"imf-statistics-gdp\" />","確立年月日1"=>"927年/843年","夏時間"=>"+1","GDP/人"=>"36,727<ref name=\"imf-statistics-gdp\" />","位置画像"=>"Location_UK_EU_Europe_001.svg","略名"=>"イギリス","面積順位"=>"76","GDP順位MER"=>"5","人口密度値"=>"246","確立年月日2"=>"1707年","首都"=>"ロンドン","公式国名"=>"{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}(スコットランド・ゲール語)<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}(ウェールズ語)<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}(アイルランド語)<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}(コーンウォール語)<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}(スコットランド語)<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>","GDP統計年元"=>"2012","ccTLD"=>".uk / .gb<ref>使用は.ukに比べ圧倒的少数。</ref>","ISO 3166-1"=>"GB / GBR","確立年月日4"=>"1927年","首相等氏名"=>"デーヴィッド・キャメロン","面積大きさ"=>"1 E11","公用語"=>"英語(事実上)","GDP統計年MER"=>"2012","GDP統計年"=>"2012","注記"=>"<references />","確立形態1"=>"イングランド王国/スコットランド王国<br />(両国とも1707年連合法まで)","GDP順位"=>"6","国歌"=>"神よ女王陛下を守り給え","人口統計年"=>"2011","確立形態2"=>"グレートブリテン王国建国<br />(1707年連合法)")

28. MediaWikiマークアップの除去

#=========================================================================================
28. MediaWikiマークアップの除去
27の処理に加えて,テンプレートの値からMediaWikiマークアップを可能な限り除去し,国の基本情報を整形せよ.
=========================================================================================#
# remove <ref>...</ref> 
h(s) = replace(s, r"<ref.*?>.+?</ref>"ms => s"")
# remove <.+ />
i(s) = replace(s, r"<.*?/>" => s"")
# remove []
j(s) = replace(s, r"\[.+? (.+?)\]" => s"\1")
# remove {{}}
k(s) = replace(s, r"\*?\{\{.+?([^\|]+?)\}\}" => s"\1")
# print
field_list = map(m->m.captures[1], eachmatch(r"^\|(.+?) = (.+?)(?=\n\||\n)"ms, txt))
for f in field_list
    println("$f : " * basic_info_mod2[f]|>h|>i|>j|>k)
end

略名 : イギリス
日本語国名 : グレートブリテン及び北アイルランド連合王国
公式国名 : United Kingdom of Great Britain and Northern Ireland
国旗画像 : Flag of the United Kingdom.svg
国章画像 : イギリスの国章
国章リンク : (国章)
標語 : Dieu et mon droit(フランス語:神と私の権利)
国歌 : 神よ女王陛下を守り給え
位置画像 : Location_UK_EU_Europe_001.svg
公用語 : 英語(事実上)
首都 : ロンドン
最大都市 : ロンドン
元首等肩書 : 女王
元首等氏名 : エリザベス2世
首相等肩書 : 首相
首相等氏名 : デーヴィッド・キャメロン
面積順位 : 76
面積大きさ : 1 E11
面積値 : 244,820
水面積率 : 1.3%
人口統計年 : 2011
人口順位 : 22
人口大きさ : 1 E7
人口値 : 63,181,775
人口密度値 : 246
GDP統計年元 : 2012
GDP値元 : 1兆5478億
GDP統計年MER : 2012
GDP順位MER : 5
GDP値MER : 2兆4337億
GDP統計年 : 2012
GDP順位 : 6
GDP値 : 2兆3162億
GDP/人 : 36,727
建国形態 : 建国
確立形態1 : イングランド王国/スコットランド王国(両国とも1707年連合法まで)
確立年月日1 : 927年/843年
確立形態2 : グレートブリテン王国建国(1707年連合法)
確立年月日2 : 1707年
確立形態3 : グレートブリテン及びアイルランド連合王国建国(1800年連合法)
確立年月日3 : 1801年
確立形態4 : 現在の国号「グレートブリテン及び北アイルランド連合王国」に変更
確立年月日4 : 1927年
通貨 : UKポンド (&pound;)
通貨コード : GBP
時間帯 : ±0
夏時間 : +1
ISO 3166-1 : GB / GBR
ccTLD : .uk / .gb
国際電話番号 : 44
注記 : 

29. 国旗画像のURLを取得する

#================================================================
29. 国旗画像のURLを取得する
テンプレートの内容を利用し,国旗画像のURLを取得せよ.(
ヒント: MediaWiki APIのimageinfoを呼び出して,ファイル参照をURLに変換すればよい)
=================================================================#
g2(s) = replace(match(r"\[\[([^\|]+?)\|", s).captures[1], r" " => s"_")

x = readlines(`curl -s "https://ja.wikipedia.org/w/api.php?format=json&action=query&prop=imageinfo&iiprop=url&titles=$(g2(basic_info_mod1["国章画像"]))"`)
res = JSON.parse(x[1])
print(res["query"]["pages"]["-1"]["imageinfo"][1]["url"])
https://upload.wikimedia.org/wikipedia/commons/9/98/Royal_Coat_of_Arms_of_the_United_Kingdom.svg

別の方法(ベタな方法)

改行区切りで配列に変換する愚かそうな方法を使わない方法。多分こっちが想定されてる方法。肝は、r"..."msなどの修飾子の設定。参考

21. カテゴリ名を含む行を抽出

# 21. カテゴリ名を含む行を抽出
match_arr = eachmatch(r"(\[\[Category:.*\]\]\n?)", txt)
map(m->m.captures[1], match_arr)

22. カテゴリ名の抽出

# 22. カテゴリ名の抽出
match_arr = eachmatch(r"\[\[Category:([^\W]+).*\]\]\n?", txt)
map(m->m.captures[1], match_arr)
# [m.captures[1] for m in match_arr] 

23. セクション構造

# 23. セクション構造
match_arr = eachmatch(r"(==+)\s?([^=]+)\s?==+", txt)
f(m) = "$(length(m.captures[1])) : $(m.captures[2])"
print(map(f, match_arr))

24. ファイル参照の抽出

# 24. ファイル参照の抽出
match_arr = eachmatch(r"(ファイル|File):.*?([^\s]+\.\w+)[^\w/\.]", txt)
print(map(m->m.captures[2], match_arr))

25. テンプレートの抽出

# 25. テンプレートの抽出
# ’|’で始まる行は基本情報テンプレートでしかないらしい
# より厳密には、基本情報{{...}} だけ抽出してその中に対してパターンマッチングするべき。
match_arr = eachmatch(r"^\|(.+?) = (.+?)(?=\n\||\n)"ms, txt)
bi_dict = Dict()
f(m) = bi_dict[m.captures[1]] = m.captures[2]
map(f, match_arr)
print(bi_dict)
5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2