質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

6回答

2443閲覧

WEBスクレイピング:正規表現にはどの言語?

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2016/09/23 11:17

webスクレイピングの技術を高度に習得したく正規表現を猛勉強中です。

質問;正規表現の力を最高に引き出せる言語はどの言語でしょうか?
perlがそれだと考えていますが、皆さまの意見を聞かせてください。

言語の趨勢やモジュールの豊富さ等判断する観点はいろいろだと思いますが。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YsMana

2016/09/24 04:57

> UTF-8の場合でも1文字を1文字として認識してくれない。 とありますが、少なくともPerlは1文字を1文字として認識しているように思います。 私の文章の意図の取り違えでしょうか。 use strict; use utf8; my $x = "あいうえお"; if( $x =~ m/^(.)/ ){ print "$1\n"; #==> あ }
raccy

2016/09/24 05:48

> YsManaさん `use utf8;`を使った場合、文字列リテラル(UTF-8であることが前提)を内部的にはUnicode文字列に変換して扱っていますので、動作的にはJavaやPython3と同じになると思われます。UTF-8な文字列(バイト列)に対して直接正規表現の処理を行うときは、1文字を1文字として扱えないと言うことです。
YsMana

2016/09/24 05:54

確かに(UTF-8の)バイト列に対しては1文字を1文字として扱えませんね。 ただ、Perlでバイト列に対して正規表現や文字列関数を使うのは基本的にやってはいけないことだと思います。 (文字列として扱うのは必ずdecodeしてからにするべき。) やってはいけないことをやって日本語処理に難点があるというのは語弊があるかなと。
raccy

2016/09/24 12:03

「デコードしない場合」と追記しておきました。
退会済みユーザー

退会済みユーザー

2016/09/26 12:46 編集

>YsManaさん (文字列として扱うのは必ずdecodeしてからにするべき。)とありますがなぜですか?
YsMana

2016/09/26 14:03 編集

> (文字列として扱うのは必ずdecodeしてからにするべき。)とありますがなぜですか? そうしないと文字列としてではなくバイト列として扱われてしまうからです。 ・追記 参考になりそうなページをいくつか上げておきますね。 Perlによる日本語コード変換のメモ(第二版) http://hikoboshi.org/perl/utf8.html Perl: 文字コードとutf8フラグについて - @bayashi Wiki https://bayashi.net/wiki/perl/unicode Perl の内部形式に関する考察 http://www.vividcode.info/perl/internalformat.xhtml
guest

0

ご質問の意図からは少し外れますが、
スクレイピングの手段としての正規表現ですよね?

でしたら、(ホスト)言語間の多少の差を気にするより、
XPath」(とDOM)も習得した方がオススメです。

手段が複数あるとやりやすい方でやれるから、
結果的にコードが簡明になることが多いです。

もう少し言うと、正規表現は単純なときは手軽ですが、
複雑になったときに読み書きが苦しいですよね。

XPathやDOMは、階層構造を持っているので、
冗長ですが複雑なときに順を追って読み書きしやすいです。

そもそも、XPathも言語なので、正規表現の実装の違いだけで、
言語ひとつ分を埋めるほどの差を付けるのは難しいです。
ですから、正規表現とXPathを使い分ける方が強力だと思います。

投稿2016/09/23 11:44

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/23 13:12

ありがとうございます。恥ずかしながらXPathを初めて知りました。ありがとうございます!
guest

0

Webページのスクレイピングでは、よほど簡単なページで無い限りは、正規表現で無くHTMLパーサーを使います。そのあたりご存じでなければ、下記の本などが参考になります。
Rubyによるクローラー開発技法

正規表現のPerl拡張は多くの言語で取り入れられているので、Perl拡張の正規表現を使える言語であれば、どれでも同じです。Perl Ruby PHPなど。

スクレイピングをするのであれば、上記の良書があることも有り、Rubyがお勧めです。

投稿2016/09/23 13:02

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/23 13:11

他の言語でPerlと同じ正規表現が使えるということですね!参考になります!
guest

0

正規表現が使える関数があれば基本的にどの言語でも同じなのでは?

投稿2016/09/23 12:01

CodeLab

総合スコア1939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/23 13:13

関数というのは拡張モジュールのことですか?
CodeLab

2016/09/23 13:51

拡張モジュールというのをどういう意味で使っていらっしゃるのかわかりませんが、多くの言語で正規表現を扱うための何らかの仕組みが入っていると思いますし、無くても外部のライブラリで実現できるものがほとんどだと思います。 ただ、WebスクレイピングでHTMLをパースするのに正規表現を使うのは非常に面倒ですのでやめておいたほうが無難です。 HTMLやXMLを分解するためのパーサーライブラリが各言語でいろいろあるはずなので、そういったものを利用すべきです。
guest

0

jQueryで有名なセレクタを使う手もあるかもしれません。
Javaの場合、JsoupというOSSライブラリでjQuery風のセレクタが使えます。
他の言語でもセレクタでスクレイピングできるのかもしれませんね。

投稿2016/09/23 14:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/26 12:30

わかりました。ありがとうございます!
guest

0

正規表現といえばPerlでしょうけど、PHPもPCREすなわちPerlのコンパチで動くので
同等の能力は期待できるかもしれません。

投稿2016/09/23 11:47

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/26 12:32

そうですね。現在はpcreを拡張した鬼車(鬼雲)が一番優秀なようですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問