programing sisters 姉

プログラミングを学習するブログです

独学プログラマー17章読んでみた:正規表現

 

正規表現についてはそもそも意味から何も知らなかったので勉強になりました。

正規表現とは「連続した文字列の検索パターン定義」というものです。一致する文字列をgrepコマンドで検索する方法、pythonのプログラムで検索する方法が詳しく載ってありました。

はじめに

$ export GREP_OPTIONS="--color=always"

とすることで該当する文字の色を変えて出力してくれます。

 

grepコマンドの正規表現

 

grepコマンドは前回のMacでのターミナル上で使える検索するためのコマンドです。

 

$ grep [検索したい文字列]  [ファイル名]

で文字列を検索することができます。

 

$ grep -i [検索したい文字列]  [ファイル名]

-iを追加することで大文字小文字を無視して検索をかけれる。

 

$ grep -o [検索したい文字列]  [ファイル名]

-oを追加することで一致した単語だけを出力できる。

 

正規表現では特別な文字を使うことで単に文字が一致するだけでないものも検索することができるらしい。

 

$ grep ^[検索したい文字列]  [ファイル名]

^[検索したい文字列]こう書くことで検索したい文字列が先頭にきているものを検索できる。

 

$ grep [検索したい文字列].  [ファイル名]

[検索したい文字列]. ピリオドを検索したい文字列の後に書くことで[検索したい文字列]の後に何がきてもその文字列を出力できる。

 

$ grep [検索したい文字列]$  [ファイル名]

[検索したい文字列]$と書くと、[検索したい文字列]が文の終わりに来るものだけを検索できる。

 

 

前回の章のパイプを使った例が載ってました。

 

$ echo two,too,three | grep t[ow]o

[文字1 文字2]とかくとどちらかの文字が該当すれば出力されます。

f:id:yoshinon444:20181015175251p:plain

こんな感じでtwoとtooだけが赤く出力されています。

 

数値を検索するには[ [:digit:] ]という正規表現を使います。

$ echo 123,hi 345,hi | grep [ [:digit:] ]

[ [:digit:] ]を書くだけで数字が検出できます。

f:id:yoshinon444:20181015175521p:plain

こんな感じ。

 

正規表現では

  • アスタリスク * :直前のパターンが0回以上一致
  • ピリオド . :全ての文字列に一致

というルールがあります。なので .* の様に組み合わせると全ての文字列に該当します。アスタリスクは貪欲なので、ルールに当てはまる文字列の中で一番長いものに該当します。非貪欲な正規表現もありますが、それはgrepでは使えないらしい。pythonでは使えるのでその例は後で載せます。

f:id:yoshinon444:20181015180658p:plain

こんな感じで__[文字列]__の一番長いものに該当します。

 

また、特別な文字を普通の文字として使いたい場合は、バックスラッシュを二つかけばokです。

f:id:yoshinon444:20181015180936p:plain

こんな感じ!お金大好きですね!

ちなみにMacでバックスラッシュはoptionキー+¥です。検索すればすぐ出て来るけれども一応書いておく。

 

 

python正規表現

 

python正規表現を使う場合、標準ライブラリのre(regular expression:正規表現)をimportする必要があります。reモジュールの中にあるfindall関数正規表現パターンと検索対象のテキストを渡すと、一致した全ての部分をリストで返します。

f:id:yoshinon444:20181018121234p:plain

一番上にimport reの記述が必要です。この出力は['Beautiful']です。

 

大文字小文字を無視して検索をかけるには、re.IGNORECASEをfindall関数の引数として与えます。

f:id:yoshinon444:20181018115252p:plain

この出力も上と同じです。

 

また数値との一致を検索するには、"\d"を引数として与えます。

f:id:yoshinon444:20181018115540p:plain

この出力は['1','2','3','4','5','6'] です。

 

pythonで使える非貪欲なアスタリスクは*?という記号で表されます。貪欲なアスタリスクでは、ルール内での一番長い文字列に一致すると説明しましたが、非貪欲なアスタリスクはできるだけ文字数が少ない文字列に一致します。

f:id:yoshinon444:20181018120629p:plain

ここで.*?は全ての文字列に一致します。この出力は、['_i_','_love_','_you_']です。

 

正規表現のこと何も知らなかったけど、詳しく書いてあってありがたい。使いこなせるようになりたいな〜。