[Powered by Google Translate] [セミナー:正規表現によるパターンマッチング] [ジョンMussman-ハーバード大学] 【これはCS50.-CS50.TV] オーケー。まあ、誰も歓迎。これはCS50 2012です。 私の名前はジョンであり、私は正規表現について今日話されます。 正規表現は、主なツールですが、また時々使用 コー​​ドの中で積極的に本質的にパターンや文字列を一致させることができます。 だからここXKCDからWebコミックです。 この漫画ではキラーが持っている殺人事件の謎があります 休暇で誰かに続き、主人公がしなければならない アドレスを探してメールの200メガバイトを検索。 そして、彼らは正規表現を知っているとき誰かをあきらめしようとしています - おそらくスーパーヒーロー - 急襲ダウンといくつかのコードを書き込みます と殺人ミステリーを解決します。 だから、おそらくそれはあなたが行うことに権限を与えられるというものになります このセミナーの後に。 私達はちょうど言語に簡潔な紹介を提供しようとしている そしてあなた自身の上に多くのリソースの後に行くには十分に必要な手段を与える。 だから正規表現は次のように基本的に見える。 これはRubyで正規表現です。 これは、言語間ひどく違いはありません。 私たちはRubyで正規表現を開始し、マークするだけスラッシュで持つ。 そして、これは電子メールアドレスのパターンで検索する正規表現です。 だから我々は最初のビットで任意の英数字を探してください。 電子メールアドレスは、しばしばアルファベット文字で開始する必要があるためです。 そして、任意の特殊文字は、@記号が続く。 そして、ドメイン名の同じもの。 そして2と4文字の間、。comを探すために。ネット、などなど。 その結果、正規表現の別の例である。 だから正規表現は、テキスト内のpattersを見つけるためのプロトコルです。 彼らは、比較、選択、および置換を行う。 ディレクトリ内の54で終わるすべての電話番号を見つけることです3番目の例では、そう。 だから我々のために検索することができCS50ディレクトリまでデビッドリッピング前 我々は括弧を持っているパターンは、その後3つの数字は、その後、括弧を終了 その後、3以上の数字、ダッシュ、2つの数値、および54。 そして、それは、我々はそのために検索するために正規表現を思い付く方法本質だろう。 だから、そこにある - 私たちのような少しであるCS50でいくつかのことを行っている そう、正規表現、 - 例えば - dictionary.Cファイルに スペルチェックの問題のセットのためにあなたは関数fscanfを使用した可能性があり 辞書から単語を読み込む。 そして、あなたは割合の45秒は、45文字の文字列を探していることがわかります。 だから、基本的な正規表現のように多少です。 そして、あなたはそこに法案を合わせ、任意の45文字を持つことができます そしてそれらを拾う。 そして、最新のWebプログラミングの問題の2番目の例 PHPのためのディストリビューションのコードで設定我々は実際に単純な正規表現を持っている。 、この1つは、単にWebページが渡されているかどうかをチェックするために探しています どちらかのログインを一致または登録ログアウト。PHPは。 そして、その正規表現のマッチングに基づいて、trueまたはfalseを返す。 だからときに正規表現を使うのですか? なぜあなたは今日ここにありますか? だから、何かがあるとき、正規表現を使用したくない さらに簡単にあなたのために仕事をしていません。 だから、XMLとHTMLは、実際にはかなりトリッキーです 我々は少しで見るように正規表現を記述する。 だから、これらの言語のための専用のパーサがあります。 また、頻繁にトレードオフと精度で大丈夫する必要があります。 あなたがしようとしている場合は - 私たちは、電子メールアドレスの正規表現を見ました しかし、あなたは特定の電子メールアドレスを求めていましたし、徐々に言う それがより正確になったように正規表現は複雑になるかもしれません。 だから1のトレードオフになります。 あなたは大丈夫、正規表現で作っていることを確認する必要があります。 あなたが探しているかを正確に知っているなら、それはより多くの意味をなさないかもしれません 時間に入れて、より効果的なパーサを記述する。 そして最終的に規則性を持つ歴史的な問題があります 表現や言語。 正規表現は、実際にははるかに強力よりも あたりの正規表現は、正式な意味で言う。 だから私は、正式な理論にすぎ行きたくない しかし、ほとんどの言語は、我々、実際のコードは、正規ではないこと。 正規表現は時々すべてが安全であると考えていない理由と、これはです。 だから基本的には言語のためチョムスキー階層があり、 と正規表現は組合、連結を使用して構築されている 我々は数分で表示されるとクリーネスター操作。 あなたが興味を持っている場合は、理論的にはフードの下にそこに起こって非常にたくさんある。 簡単な歴史だから - ここだけコンテキストに - 定期的なセットが登場しました 1950年代に、そして我々は、単純なエディタを持っていた 正規表現を組み込む - ちょうど文字列を検索。 グレップ - コマンドラインツールである - 最初の一人だった 1960で正規表現を組み込むことは非常に一般的なツール。 80年代では、Perlが建てられました - プログラミング言語である 非常に目立つように正規表現を組み込んでいます。 そして、もっと最近では、Perl互換の正規表現を持っていた 基本的には同じ構文の多くを使用する他の言語でのプロトコル。 もちろん、最も重要なイベントは、2008年にあった どこで最初の国立の正規表現の日があった その私は、あなたがそれを祝うためにしたい場合は6月1日であると考えています。 ここで再び、ほんのもう少し理論。 だから正規表現を構築するカップルの異なる方法があります。 一つの簡単な方法は、あなたがしようとしていることを表現を構築することです 解釈する文字列で実行 - 基本的にことはほとんどミニプログラムをビルド 文字列の部分を分析して表示されますが、 "ああ、これは正規表現に適合しないか?" その後のことを実行します。 あなたは非常に小規模な正規表現があるのであれば、これはおそらくです。 それを行うための最も効率的な方法。 そして、あなた場合 - 別のオプションは、再構築しておくことです あなたが行くように表現し、そのシミュレート可能です。 と正規表現アルゴリズムでこれらの初期の試みはあった 比較的単純で比較的速いが、多くの柔軟性を持っていませんでした。 だから我々を見てしようとしていることのいくつかをさえ行う 今日、我々は、より複雑な正規表現をしなければならなかった 潜在的にはるかに遅いです実装、心に留めておいて何かされるように 攻撃の様々な正規表現の否定もあります これらの新しい実装の可能性を活用すること 非常に複雑になるための正規表現。 そして、我々はバッファオーバーフロー攻撃で見たのとほぼ同じ意味で、 あなたは、仕事その再帰ループを作ることによる攻撃を持っている メモリの容量をオーバーラン。 ところでRegexen、正規表現の公式の複数形の一つである アングロサクソンで牛に類推。 わかりましたので、Pythonライブラリの人にここの多くはMacを持っている、 だから、実際に画面上でこれをプルアップすることができます。 正規表現はPythonに組み込まれています。 そしてPythonのは、Macとも、このリンクからオンラインで入手にプリロードされています。 だから、あなたは一時停止とは、Pythonを持っていることを確認することができます見ている場合 我々はここで遊んでよう。 マニュアルオンラインであなたがちょうどあなたのコンピュータに、Pythonを入力するそうだとすれば、あります あなたは、バージョンは、端末で起動していることがわかります。 だから私は、Pythonのバージョン2のためのマニュアルへのリンクと同様にチートシートを提供した。 そこのPythonのバージョン3がありますが、お使いのMacは必ずしもありません プリロードされているが付属しています。 だからひどく異なっていない。 わかりましたので、Pythonで正規表現を使用してのいくつかの基本。 だからここに私は非常に単純な式を使用したので、私はPythonのimport再やった その後re.searchの結果を取った。 そして、検索は2つの引数をとります。 最初は正規表現であり、第二は、テキストである または解析したい文字列を指定します。 そして私はresult.groupをプリントアウト。 したがって、これらは、我々が今日見に行くされている2つの基本的な機能である 正規表現について学びます。 だから、この正規表現は、ここで分解 Hした後、次に\ wとmはそう\ wがただそこに任意のアルファベットの文字を受け入れます。 そこでここでは、その後、 "H"、別のアルファベットの文字を探しています その後、mは、ので、ここでハムにマッチしている "エイブラハム·リンカーンとハムのサンドイッチ。"で これは、そのグループの結果である。 我々が行うことができますもう一つは、Pythonでテキストの我々の前に文字列を使用しています。 だから私は、私が先に行くと、ここでのことをプルアップしますね。 Pythonのimport再。 と私は同じことをしていた場合 - 、私たちがテキストであるとしましょう "アブラハムは、"私たちはズームインましょう - そこに私達は行く。 テキストは "アブラハムはハム食べる。"です さて、その後= re.searchを生じる。 そして、私たちの式は、Hすることができますし、私はドットMを行います。 だからドットはただ、数字を含む新しい行ではない任意の文字を取り パーセント記号は、そのような何か。 そしてテキスト - ブーム - そしてresult.group-うん。 だから、ここで基本的な機能を実装するだけでどのようです。 その狂ったテキスト - - 私たちは、そのテキストの指輪を持っていた場合はバックスラッシュをたくさん言う付属 と内部の文字列とエスケープシーケンスのように見えることができる事、 その後、我々はおそらく、受け入れていることを確認するために生のテキスト入力を使用したい。 そして、それはちょうどそのように見えます。 我々はそこにそれらのそれぞれを探していたのであれば我々は何かを見つけるべきではありません。 しかし、それはあなたがそれを実装する方法であり、直前の文字列 正規表現は、文字rを置く。 わかりましたので、私たちは続けることができます。 右のすべて - ので、私たちはここでカップル反復パターンを見てみましょう。 だから、あなたがしたいことを一つのことは、物事を繰り返している テキストを検索しているとして。 あなたが行うのab * - だから、bのいずれかの数字が続くんする。 そして、他の一連のルールは、あまりにもあります。 そして、あなたはこれらの上昇のすべてを見ることができる、私はただのいくつかを実行することになるでしょう 最も一般的なものを使用していました。 だからAB +は任意のN bは0より大きいが続いています。 AB? bは0または1が続いています。 AB {N}は、bのNが続き、その後、というようにです。 あなたが中括弧で2つの数値がある場合は、範囲を指定している それは、おそらく一致させることができる。 だから我々は1分でカップル反復パターンでより多くを見ていきます。 だからここのツールをマッチングこれらのパターンを使用する場合に留意すべき2つのこと。 我々はHMを見てみたいそう言う、 "エイブラハム·リンカーンは、ハムのサンドイッチを作る。" だから私はアブラハムにエイブラハム·リンカーンの名前を変更しました。 そして今、我々は、この検索機能によって返されるものを探しています そしてそれはこの場合のみでハムを返します。 そしてそれは、検索だけで自然に左の最もキューがかかるので、それをし。 そして、あなたが指定しない限り、すべての正規表現はそれを行います。 我々はすべてを見つけたいと思った場合は、そのための機能があります - すべてを見つける。 だからすべて= re.findall( 'h.m'、テキスト)のように見える可能性のある その後all.group()。 すべてはハムとハムの両方を生成し、この場合にはアブラハム内の文字列の両方の各ハム。 だから、それはまた別のオプションです。 グレート。心に留めておくべき他の事は、正規表現が直感的に最大を取るということです。 私たちは、この例を見てみましょう。 我々は、ここに、その一番左の検索をしましたし、私は大きな検索を試みた クリーネスター演算子を使用して。 だからために、 "エイブラハム·リンカーンは、ハムのサンドイッチを作りました"と私は戻ってきた 結果としてM。 その間違いの理由は、私は、任意の数をとっているということでした 私はHとMの間に行くには何も指定しなかったため、時間です。 その中にMとしか例 - Mを持っていたそこだけ例 とhの任意の数は、単に文字列のMでした。 その後、私は再びそれを試してみました、私は言った、 "さて、私たちはここで、実際の最大のグループを紹介しています。" そして私は、Hをしました。* M、単にhおよびmの任意の数の文字を返すように。 そして、あなたはちょうど出始めているといい、よくこの、 "ああ、う考えている場合 私にハムを取得するには、 "実際にはエイブラハム·リンカーンの時間からすべてを取る ハムの終わりまでのすべての方法。 それは貪欲であり、それは時間を見ている - すべてのこの他のテキスト - M、 それはそれが入って必要なものである これは特にひどいです - これは我々がすることもできます機能です それは他の機能を使用して貪欲ではないために指定します。 しかし、これは我々は、特に留意する必要が何か HTMLテキストを見たとき、それは理由の一つである 正規表現は、HTMLのため困難です。 なぜならあなたは、中央のHTML開始タグ、次に原料の多くを持っている場合 その後いくつかの他のHTMLは、プログラムの中でずっと後にタグを閉じた あなただけおそらく誤ってHTMLコードの多くを食べている。 すべての権利 - ので、より多くの特殊文字は、他の多くの言語と同様に、 我々は、スラッシュを使用してエスケープします。 だから我々は、新しい行を除く任意の文字を指定するためにドットを使用することができます。 我々は、任意のアルファベットの文字を指定するには、エスケープのwを使用することができます。 数値文字 - と任意の整数のための類推エスケープdだけ。 私たちは、指定することができます - 私たちは、関連する表現を指定するために括弧を使用することができます。 だから、これはa、b、cのいずれかを受け入れるだろう。 そして、我々はまた、指定またはAまたはBのどちらかのオプションができます。 例えば ​​- 私たちは複数の可能性を探していた場合 括弧内に私たちは、のように、または演算子を使用することができます - だから私たちは、ここで、この例に戻りましょう。 そして今、私たちはみましょう - それを私たちはここに、この例に戻りましょう、と AEを取る - ので、これは返すべきである - 私は、これはまだアブラハムだと思います。 このだから - 私たちはすべてを行う場合 - すばらしい。 だから私たちは、ここでテキストを更新してみましょう。 "彼の裾上げながらアブラハムはハムを食べる - 。ヘミングしばらく"グレート。 すべて。グレート。今、私たちは、ハム、ハム、そして裾を取得します。 しばらくヘミング - 彼にハミングしながら - 裾彼にハミングしながら。グレート。 同じこと。 今、すべてがハムや彼に拾うことなく、それでもただ、ハム、ハム、と裾を返します。 グレート - ので、我々はいずれかでその見たいと思った場合はどうでしょう - ので、我々はまた、行うことができます 彼または - 私たちはそれに戻ってくるだろう。 大丈夫 - そう - すべての権利 - の位置であなたもキャレットやドル記号を使用することができます あなたが先頭または文字列の末尾に何かを探していることを指定します。 先頭または単語の末尾または。 すなわち、このを使用する1つの方法である。 大丈夫 - そう、私たちは、テキストの少し大きめのブロックで遊んでみましょう。 私たちはここで、この行を言ってみましょう - ここでこの文。 正規表現の力は、彼らはパターンを指定できることです ただ文字を固定されていません。 私たちが作ってみよう - 私たちは、このブロックを呼び出してみましょう。 その後、私たちはそのインのすべてを読みます そして持っている - 私たちはすべての=をしてみましょう、我々は有利にここで検索することができますいくつかのものがそう何ですか? 私たちは、式の耳のために見ることができた。 非常に面白くない。それでどう?我々は何が起こるかわかります。 私はそれを問題にしました。 だから再、すべて前のものの任意の数。 だから、おそらく数回を最初からすべての再にすべてを返さなければなりません。 そして、ここでは、正規表現の力を持っていることは、彼らです ここだけでなく、文字があるパターンを指定することができます。 だから、最大最後の再にすべての方法は、それが一番左から始まり、貪欲だった。 私たちは見てみましょう - 私たちは他に何のために見ることができた。 あなたが代名詞彼女と彼を探しに興味を持っていた場合、私は一つのことを推測し、 あなたは、sは0または1に等しいことを確認することができる と表現は、彼、そしておそらく復帰するつもりはない - そこに我々は力を見ているので、ああ、私は彼がそれを返すと思い、その日、ここにある。 私たちは、これは何かの開始時に来ていることを指定してみましょう。 それがオフになった場合、私たちは見てみましょう。 だから私たちは脂肪を行うことができ、そこに我々は何も得ることはありませんので、彼女と彼 このフレーズでは発生しない。 グレート。大丈夫 - そう戻って猫にここに。 だから、複雑なパターンは、脳を傷つけている。 我々はこれらの問題を回避するために、正規表現を使用する理由だからです。 だからここにあなたが周りに遊ぶことができるいくつかの他の有用なモードは次のとおりです。 今日は検索を見ましたが、あなたはまた、マッチ、スプリット、findallの、およびグループを使用することができます。 あなただけのほかに正規表現を行うことができますので、他のクールなもの パターンを探して、パターンを取って、すべての一致を保持している - その変数 - 、後にあなたのコードでそれらを使用した。 それは非常に役立つことがあります。他のものはカウントされる可能性があります。 だから私たちは、正規表現パターンのインスタンスの数を数えることができます それは我々がグループを使用することができるものです。 そして、他のモードもまた可能である。 だから、僕は、正規表現を使用することができます他の方法についてもう少しお話したいと思います。 したがって、1つのより高度なアプリケーションでは、ファジー·マッチングである。 あなたは、表現のためのテキスト、ジュリアス·シーザー、探しているのであれば そして、あなたは、他の言語でガイウス·ユリウス·カエサルや名前ジュリアスシーザーのどちらかを参照してください その後、あなたはまた、これらの値にいくつかの重みを割り当てることができます。 そしてそれは十分に近くであれば - それは、特定のしきい値を超えた場合 - 次にあなたが欲しい ジュリアス·シーザーを受け入れることができるように。 だから、同様にいくつかの他の言語でそのための夫婦異なる実装があります。 便利な小さなアプリケーションへのオンライン - ここではいくつかの他のツール、正規表現パルは あなたの正規表現が正しく構成されているかどうかを確認。 あなたのデスクトップから実行できるスタンドアロンのツールもあります ウルトラピコなど、および同様に単に料理本。 あなたは、正規表現のトンを伴うプロジェクトを行っているのであれば これはおそらく、今日の範囲外に行く場所です。 そして、ちょうどあなたにそれがどのように共通の感覚を与えるために grepのがUnixの中にある、Perlは内蔵されており、C CのPCREがあります そして、これらすべての他の言語にも正規表現のパッケージを持っている それは、我々は今日の味を持って基本的に同じ構文を使用して動作します。 PHPやJava、Rubyの、というように。 Googleソースコード検索は、実際には特筆すべきであり、それは、次のいずれかです。 国民がアクセスできるようになり、そこに比較的少数のアプリケーション 正規表現を使用してそのデータベース。 あなたは、Googleコード検索で調べるのであれば、コードを見つけることができます あなたは、関数が使用されるかもしれない方法のインスタンスを探している場合は、 あなたは、異なるケースのすべての種類で使用されてその機能を見つけるために正規表現を使用することができます。 あなたは、fwriteを探すことができ、その後、書き込みのフラグを探したり、読むことができた あなたは、そのような場合に使用されてfwriteの例を望んでいる場合。 そこに同じ事はそう、ここでいくつかの参照があります。 これがあればそう転送行くだけでなく、オンラインで利用できるようになります あなたは、Python、grepを、Perlのを見てみたい - あなただけのいくつかのインスピレーションを取得したい ここで理論でもっと見たい場合や場所オフいくつかの良い跳躍です。 どうもありがとうございました。 [CS50.TV]