webスクレイピングの技術を高度に習得したく正規表現を猛勉強中です。
質問;正規表現の力を最高に引き出せる言語はどの言語でしょうか?
perlがそれだと考えていますが、皆さまの意見を聞かせてください。
言語の趨勢やモジュールの豊富さ等判断する観点はいろいろだと思いますが。
何卒よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
正規表現と言っても、いくつかの種類に分かれます。
- POSIX
伝統的な正規表現。AWKなどはこれ。古い。マルチバイト文字全く考慮されていない。
C++(STL<regex>), PHP(ereg_* [PHP7.0から削除]), AWK
- PCRE(Perl互換)
Perlで採用されたPOSIXを拡張した正規表現。独立したライブラリPCREとして使用可能。UTF-8以外のマルチバイト文字を使う事は想定されていないし、UTF-8の場合でも1文字を1文字として認識してくれない。
C/C++(PCRE), Perl(バイト文字列の場合), PHP(preg_*)
- PCRE相当(Unicode文字列として処理)
元々のPCREそのものではないが、だいたい同レベルの正規表現。言語そのものがUincodeで処理しているため、マルチバイト文字対応とかは関係無い。
Java, Python3, JavaScript, C#, C++(STL<regex>でECMAScriptを選択), Perl(デコード済みのテキスト文字列の場合), Perl6?
- 鬼車(および鬼雲)
Rubyで採用されたPCREを拡張した正規表現。マルチバイト文字対応で、日本語の文字も1文字は1文字として認識できる。Shift_JISの文字列をエンコードせずにそのまま解釈したい場合は、これ以外はたぶんないと思う。
C/C++(Oniguruma, Onigumo), Ruby, PHP(mb_ereg_*)
POSIXとPCREと鬼車でのマルチバイト文字に対する処理の違いは、PHPでのそれぞれの関数での違いを見ると良いでしょう。(PHP7.0以降はeregが削除されていますので、PHP5.6などで確認してください)
PHP
1<?php 2echo "「a」の場合\n"; 3$a = "a"; 4var_dump(ereg('^.$', $a)); 5var_dump(preg_match('/^.$/', $a)); 6var_dump(mb_ereg_match('^.$', $a)); 7echo "「あ」の場合\n"; 8$a = "あ"; 9var_dump(ereg('^.$', $a)); 10var_dump(preg_match('/^.$/', $a)); 11var_dump(mb_ereg_match('^.$', $a));
出力結果
「a」の場合 int(1) int(1) bool(true) 「あ」の場合 bool(false) int(0) bool(true)
日本語を扱う場合、JavaやPython3等の場合は、そもそもUnicode(内部的にはUTF-16の場合もある)として処理してしまうので、正しく処理できます(ただし、U+10000以上でサロゲートペアになっている場合はうまくいかないかもしれない)。しかし、Unicodeではなく、文字コードそのままで処理したいというのであれば、RubyやPHP(mb_erge_)を使う必要があるでしょう。Perl(6より前かつテキスト文字列にデコードしない場合)やPHP(preg_)は日本語の処理に難点があるので、避けた方が良いと思われます。
なお、Javaの正規表現はとても書きづらいためお勧めしません。参考: 正規表現リテラルは本当に必要なのか?
投稿2016/09/23 14:03
編集2016/09/24 12:07総合スコア21735
0
ご質問の意図からは少し外れますが、
スクレイピングの手段としての正規表現ですよね?
でしたら、(ホスト)言語間の多少の差を気にするより、
「XPath」(とDOM)も習得した方がオススメです。
手段が複数あるとやりやすい方でやれるから、
結果的にコードが簡明になることが多いです。
もう少し言うと、正規表現は単純なときは手軽ですが、
複雑になったときに読み書きが苦しいですよね。
XPathやDOMは、階層構造を持っているので、
冗長ですが複雑なときに順を追って読み書きしやすいです。
そもそも、XPathも言語なので、正規表現の実装の違いだけで、
言語ひとつ分を埋めるほどの差を付けるのは難しいです。
ですから、正規表現とXPathを使い分ける方が強力だと思います。
投稿2016/09/23 11:44
総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Webページのスクレイピングでは、よほど簡単なページで無い限りは、正規表現で無くHTMLパーサーを使います。そのあたりご存じでなければ、下記の本などが参考になります。
「Rubyによるクローラー開発技法」
正規表現のPerl拡張は多くの言語で取り入れられているので、Perl拡張の正規表現を使える言語であれば、どれでも同じです。Perl Ruby PHPなど。
スクレイピングをするのであれば、上記の良書があることも有り、Rubyがお勧めです。
投稿2016/09/23 13:02
総合スコア84555
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/23 13:11
0
正規表現が使える関数があれば基本的にどの言語でも同じなのでは?
投稿2016/09/23 12:01
総合スコア1939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/23 13:13
2016/09/23 13:51
0
jQueryで有名なセレクタを使う手もあるかもしれません。
Javaの場合、JsoupというOSSライブラリでjQuery風のセレクタが使えます。
他の言語でもセレクタでスクレイピングできるのかもしれませんね。
投稿2016/09/23 14:15
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/26 12:30
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/24 04:57
2016/09/24 05:48
2016/09/24 05:54
2016/09/24 12:03
退会済みユーザー
2016/09/26 12:46 編集
2016/09/26 14:03 編集