見出し画像

【python】正規表現を使おうと思ったら初手から躓いてキレながら書いた備忘録


唯坂 優(たださか ゆう)です。


自然言語処理するマン
になるべく、Wikipediaライブラリからサンプルとなる文章を
しこたま取得するコードを書こうとしていたのですが、その過程で問題が。

テストコード1

import wikipedia

wikipedia.set_lang("ja")
print(wikipedia.page("犬").summary)
イヌ(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)は、食肉目・イヌ科・イヌ属に分類される哺乳類の一種である。 属名 Canis、種小名 lupus はラテン語でそれぞれ「犬」「狼」の意。亜種名 familiaris はやはりラテン語で、「家庭に属する」といった意味である。広義には、イヌ科動物全般を指すこともある(後述)。現代の日本では屋外、あるいは屋内で飼われ、ペットとして猫と並ぶ代表的な動物である。
テストコード1

このような文章を複数の記事から取得し、
そのままjanomeに突っ込んでデータをとるつもりだったのですが、

イヌ(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)は、

※中略

イヌ科動物全般を指すこともある(後述)。

これらカッコ内本来の日本語文法にはあり得ない位置に挟まってしまっている。
普通に記事を読む分にはありがたい注釈ではあるのですが、
文法データ収集したい身としてはややノイズ。

というわけで、カッコに囲まれた部分をぶった切るコードを書くべく正規表現に手を出しました。

※雑に言うと正規表現を使えばパターンに一致する箇所を文章から検出して
煮るなり焼くなり好きにすることができるのですが、
詳しく説明すると長くなるので割愛

とりあえず試しにカッコで囲まれた部分を検出するコードを書くべとやり方をググりつつ、キーボードポチポチして出来上がったコードがこちら。

テストコード2

import re
st='イヌ(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)は、食肉目・イヌ科・イヌ属に分類される哺乳類の一種である。 属名 Canis、種小名 lupus はラテン語でそれぞれ「犬」「狼」の意。亜種名 familiaris はやはりラテン語で、「家庭に属する」といった意味である。広義には、イヌ科動物全般を指すこともある(後述)。'

r=re.compile(r'\(.*\)')

s=re.findall(r,st)

print(s)
['(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)は、食肉目・イヌ科・イヌ属に分類される哺乳類の一種である。 属名 Canis、種小名 lupus はラテン語でそれぞれ「犬」「狼」の意。亜種名 familiaris はやはりラテン語で、「家庭に属する」といった意味である。広義には、イヌ科動物全般を指すこともある(後述)']
テストコード2

はぁ〜〜〜〜〜????


どういうわけか、2つのカッコ囲まれ部分のカッコ開きとカッコ閉じを繋げて
どデカい一つのカッコ囲みとして解釈してしまった様子。

こんな一文に圧縮するのが口惜しく感じるほど苦戦を続けること一時間、
やっと辿り着いた『非貪欲マッチ』なる概念。

どうもreモジュールの関数たちはなるべくデカいパターンを取ってきちゃいがちなんだそうですが、この非貪欲マッチを使うことでなるべく小さいパターンを拾ってくれるようになるそうで。見よう見まねで完成しましたこちらのコード。

テストコード3

import re
st='イヌ(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)は、食肉目・イヌ科・イヌ属に分類される哺乳類の一種である。 属名 Canis、種小名 lupus はラテン語でそれぞれ「犬」「狼」の意。亜種名 familiaris はやはりラテン語で、「家庭に属する」といった意味である。広義には、イヌ科動物全般を指すこともある(後述)。'

r=re.compile(r'\(.*?\)')

s=re.findall(r,st)

print(s)
['(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)', '(後述)']
テストコード3

できた!!

ここのfindallsubに書き換えて空白に置換してあげれば…

テストコード4

import re
st='イヌ(犬、狗、学名:Canis lupus familiaris、ラテン語名:canis、英名:dog、domestic dog)は、食肉目・イヌ科・イヌ属に分類される哺乳類の一種である。 属名 Canis、種小名 lupus はラテン語でそれぞれ「犬」「狼」の意。亜種名 familiaris はやはりラテン語で、「家庭に属する」といった意味である。広義には、イヌ科動物全般を指すこともある(後述)。'

r=re.compile(r'\(.*?\)')

s=re.sub(r,"",st)

print(s)
イヌは、食肉目・イヌ科・イヌ属に分類される哺乳類の一種である。 属名 Canis、種小名 lupus はラテン語でそれぞれ「犬」「狼」の意。亜種名 familiaris はやはりラテン語で、「家庭に属する」といった意味である。広義には、イヌ科動物全般を指すこともある。
テストコード4

完璧ィ☆

さてコレで頑張って文法データ収集するコード書いちゃうゾ〜〜☆

この記事が気に入ったらサポートをしてみませんか?