Last active
September 17, 2017 21:57
-
-
Save gfx/7973689 to your computer and use it in GitHub Desktop.
正規表現リテラルがあると便利な例。これを文字列操作メソッドで解決するとなるとかなり難しいと思われますがどうでしょう。 また、正規表現リテラルがなくてもじっさいにはあまり変わりないのですが、 \S ではなく \\S と書かなければならなかったりして注意しなければならない点が増えます。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!perl | |
use 5.10.0; | |
use strict; | |
use warnings; | |
my $localhost = join '|', map { quotemeta } 'localhost', '127.0.0.1'; | |
my $s = "http://localhost/foo http://127.0.0.1/bar http://127_0_0_1/foo/bar/baz"; | |
my @matched = $s =~ m{ http:// (?:$localhost) / \S+ }xg; | |
say "@matched"; # => http://localhost/foo http://127.0.0.1/bar |
LOCALHOST_PATTERN = re.compile(r'http:// (' + LOCALHOST + r')/\S+', re.X)
この一行が象徴的なのですが、まさにこれが正規表現リテラル+変数展開が必要な理由に見えます。
つまり、本質的にできることは変わりませんが、変数があるたびに文字列リテラルを閉じて+を書いて変数を書いてい+を書いて文字列リテラルを開始して、というのがちいち面倒なんです。面倒だから簡単に書きたい、そのほうが生産性があがる、という話です。
閉じて + というのは、
r'http:// (%s) /\S+' % LOCALHOST
とも書けますが、そうではなく埋め込みがしたいと。
それはもう完全に正規表現リテラルではなくて変数埋め込みの利点ですよね?
変数埋め込みも、あれば便利だと思いますが、 Python ではたった数タイプの削減のために
構文を複雑にはしないと蹴られました。
余談ですが、今開発中のプロジェクトでは現在 120 ファイルくらいあって、 import re しているのは
3ファイルだけでした。
もちろん、 import re とたった数タイプの面倒さを回避するために、正規表現ですれば簡単な事を
面倒な文字列操作にしたりはしていません。
startswith
や in
や split
などの基本的な文字列操作でほとんどのケースをカバーできてます。
正規表現リテラルにおける変数展開の重要性についてはたびたび出していたつもりでしたが、その点説明不足であったのならすみません。たとえばJavaScriptは正規表現リテラルがあって変数展開のない言語ですが、これは非常に使いづらくリテラルだけあっても意味がないとぼくは考えます。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
できるだけ Perl のサンプルコードと同じように書いてみました。
これを比べても、学習コストを増やして構文汚してまでリテラルがほしいとは思えません。
加えて、このように正規表現が使いたい場面自体、月に数回遭遇する程度です。