Python 実践 データ加工/可視化 100本ノック に挑戦 ノック52

ノック52:本文を抽出して1つにまとめよう

 

hashire_merosu.txtの文章をsplitを使用して分割します。

split()の引数を省略すると空白文字で分割します。

分割したそれぞれの行を空白文字と連結しています。

 

'間に挿入する文字列'.join([連結したい文字列のリスト])

 

with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    content = f.read()

content = ' '.join(content.split())
print(content)

 

次に文字を正規化します。数値は全て半角、カナは全て全角にします。

 

正規化には以下の4つがあります。

「NFD (Normalization Form Canonical Decomposition)」
NFC (Normalization Form Canonical Composition)」
「NFKD (Normalization Form Compatibility Decomposition)」
「NFKC (Normalization Form Compatibility Composition)」

  • NFDとNFCは正準等価性 (Canonical Equivalent) によって分解. 同一文字とみなす条件がより厳しい.
  • NFKDとNFKCは互換等価性 (Compatibility Equivalent) によって分解. 同一文字とみなす条件がより緩い.
  • NFDの後, 再度合成するのがNFC
  • NFKDの後, 再度合成するのがNFKC
import unicodedata
content = unicodedata.normalize('NFKC',content)

 

正規化した文章のパタンマッチングをおこないます。

re.compile()の引数がマッチしてほしいパターン内容になります。

 

#地から1字上げ] という文字列は小説の最初と最後にあるため、小説の本文を抜き出す正規表現となっています。

import re
pattern = re.compile(r'^.+(#地から1字上げ].+#地から1字上げ]).+$')
body = re.match(pattern,content).group(1)
print(body)

 

r'^.+(AAA.+BBB).+$' で、AAAから始まってBBBで終わる文章にマッチングするパターンとなります。

マッチングの範囲をもっと短く以下のように書くと「二人の様を、まじまじと見つめていたが、やがて静」

までがマッチング結果として出力されます。

pattern = re.compile(r'^.+(二人.+).+$')
body = re.match(pattern,content).group(1)
print(body)

 

最後に以下の部分は必要ないのでreplaceで空白に置き換えて削除します。

[#地から1字上げ]-------------------------------------------------------

・・・[#地から1字上げ]

 

body=body.replace('#地から1字上げ] ------------------------------------------------------- ','')
body=body.replace(' [#地から1字上げ]','')

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/* -----codeの行番号----- */