前提・実現したいこと
reライブラリのsearchメソッドでの検索テクニックが知りたいです。
スクレイピング・ハッキング・ラボという書籍でpythonのスクレイピングの勉強をしています。
https://www.geek.sc/scraping
reライブラリのsearchメソッドで下記コードが書籍に書いていました。
該当のソースコード
python
1match=re.search("((.*?)年)",today_text)
today_textの中身は例えば下記の内容が入っています。
壬午事変(1882年)
欧州石炭鉄鋼共同体が解散。機能は欧州共同体(後の欧州連合)が引き継ぐ(2002年)
searchメソッドはre.search(検索対象,文字列)のように使うらしいです。
例
python
1import re 2 3str1='I like apple' 4print(re.search('apple',str1)) 5# <re.Match object; span=(7, 12), match='apple'>
((.*?)年)
の部分がよくわからないです。
意味を教えてください。
正規表現の記述方法がわからないという事ですか??
それなら「正規表現」でぐぐったら分かりやすい解説サイトが多数あります。
ありがとうございます。例えば
https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3のページに書いています。
.*?の部分は
.が任意の一文字
*が0回以上の繰り返し
?が0回または1回
ということがわかるのですが、\(などは何を示すのでしょうか。
これで西暦の数字を抜き出せる理由がよくわからないです。
\(スラッシュの逆向き。バックスラッシュ。環境によっては円マークになる。)はエスケープ記号といって正規表現で意味を持つ文字(メタ文字)の前に付けて「次の文字は正規表現で意味を持つ文字ではなく、単なる文字ですよ」と指定するものです。
今回の例では()が正規表現で意味を持つのでエスケープしています。
> 西暦の数字を抜き出せる理由がよくわからないです。
簡単な理由は、それが正規表現のパターンとなっていて、正規表現とはそういうもので、そういう目的に使うものだからです。
適当なサイト等にあるサンプルコードで、正規表現のパターンをいろいろ見るとなんとなく分かってくると思います。
今回のパターンはものすごくざっくりいうと、
"("で始まり、任意の一文字が0回以上繰り返され、その次に"年)"がある文字列にマッチするというものです(説明がややこしい部分を省略しています)。
つまり(1996年)とかにマッチします。
それと、サンプルとコードで()の扱いが半角全角で齟齬があるのでそのあたりをしっかり作らないと正しくは動作しないでしょう。
ありがとうございます。()の半角全角は別部分のコードで該当書籍に説明あったのでわかりました。
解決したので、質問をクローズさせたいのですが、回答欄に転記いただいてもいいでしょうか。ベストアンサーとさせてください。
承知しました。
回答1件
あなたの回答
tips
プレビュー