👩💻
言語処理100本ノック 2020 (Rev 2) 第3章: 正規表現 23. セクション構造
問題
23. セクション構造
記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.
solution23.py
import re
import pandas as pd
df = pd.read_json('chapter03/jawiki-country.json.gz', lines=True, compression='infer')
text_uk = df.query('title=="イギリス"')['text'].values[0]
section_pattern = r'(={2,})(.+?)={2,}'
sections = re.findall(section_pattern, text_uk)
for section in sections:
level = len(section[0])-1
name = section[1].strip()
print(f'セクション名: {name}, レベル: {level}')
output
セクション名: 国名, レベル: 1
セクション名: 歴史, レベル: 1
セクション名: 地理, レベル: 1
セクション名: 主要都市, レベル: 2
セクション名: 気候, レベル: 2
#以下に続きます
この問題では、正規表現を用いてセクション名とそのレベルに該当する箇所を取り出します。
今回の正規表現のパターンでは、3つのグループが含まれています。
(={2,})
:"=" の文字列を表すグループ
(.+?)
:セクション名を表すグループ
={2,}
:"=" の文字列を表すグループ
sections変数は次のような構造を持ちことになります。
[(セクションのレベルを表す文字列, セクションの名前)]
('==', '国名')
('==', '歴史')
('==', '地理')
('===', '主要都市')
('===', '気候')
なお、strip()
メソッドを使用することで、前後の空白文字を削除し、綺麗なセクション名を取得することができます。
参考記事
第3章: 正規表現
re --- 正規表現操作
Python正規表現
regex101
RegexPal
RegExr
Debuggex
Discussion