私は英語の正規表現 (regex) について学んでいます。一部の概念は日本語などの他の言語にも当てはまるように見えますが、他の多くの言語には当てはまらないように感じます。たとえば、正規表現の一般的な用途は、単語に英数字以外の文字が含まれているかどうかを調べることです。書記体系が 3 つあるだけでなく、漢字も非常に複雑で、英数字よりもはるかに広い範囲にわたるため、この手法や他の手法が日本語でどのように機能するかはわかりません。私は多くの日本語コースを受講してきましたが、このテーマに関する知識がほとんどないため、このトピックに関する情報や、さらに調査すべき領域についての情報をいただければ幸いです。可能であれば、Python と Java を使用して回答していただきたいと思います。これらは私が慣れている言語です。ご協力ありがとうございました。
4 に答える
Python 正規表現は、Unicode 機能の限定的なサポートを提供します。Java、特に Java 7 の方が優れています。
Java は Unicode カテゴリをサポートしています。たとえば、\p{L}
(およびその短縮形である\pL
) は、任意の言語の任意の文字に一致します。これには日本語の表意文字が含まれます。
Java 7 は、通常日本語テキストを構成するひらがな、カタカナ、漢字、およびラテン文字を含む Unicode スクリプトをサポートします。、、、およびを使用して\p{Han}
、これらのスクリプトのいずれかの任意の文字と一致させることができます。などの文字クラスでそれらを組み合わせることができます。大文字(, など) を使用して、漢字以外の任意の文字に一致させることができます。\p{Hiragana}
\p{Katakana}
\p{Latin}
[\p{Han}\p{Hiragana}\p{Katakana}]
P
\P{Han}
Java 7 は Unicode ブロックをサポートします。Android でコードを実行する場合 (スクリプトが利用できない場合) を除き、ブロックは Unicode スクリプトよりも有用性と精度が低いため、通常はブロックを避ける必要があります。、、、 など\p{InHiragana}
、日本語のテキストに関連するさまざまなブロックがあります。\p{InKatakana}
\p{InCJK_Unified_Ideographs}
\p{InCJK_Symbols_and_Punctuation}
Java と Python はどちらも、 を使用して個々のコード ポイントを参照できます\uFFFF
。ここで、FFFF
は任意の 4 桁の 10 進数です。Java 7 は、たとえば\x{10FFFF}
. Python 正規表現は 21 ビット Unicode をサポートしていませんが、Python 文字列はサポートしているため、eg \U0010FFFF
(大文字のU
後に 8 桁の 16 進数) を使用して正規表現にコード ポイントを埋め込むことができます。
Java 7(?U)
またはUNICODE_CHARACTER_CLASS
フラグは、文字クラスの略記を\w
および\d
Unicode 対応にするため、日本語の表意文字などと一致します (ただし、\d
一二三四のような数字の漢字にはまだ一致しないことに注意してください)。Python 3 では、短縮形クラスがデフォルトで Unicode 対応になります。re.UNICODE
Python 2 では、 orre.U
フラグを使用すると、省略形クラスは Unicode に対応します。
おっしゃる通り、すべての正規表現のアイデアがすべてのスクリプトに同じように適用されるわけではありません。いくつかのもの (文字の大文字小文字など) は、日本語のテキストでは意味を成しません。
Python の場合
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
kanji = u'漢字'
hiragana = u'ひらがな'
katakana = u'カタカナ'
text = kanji + hiragana + katakana
#Match Kanji
regex = u'[\u4E00-\u9FFF]+' # == u'[一-龠々]+'
match = re.search(regex, text, re.U)
print match.group().encode('utf-8') #=> 漢字
#Match Hiragana
regex = u'[\u3040-\u309Fー]+' # == u'[ぁ-んー]+'
match = re.search(regex, text, re.U)
print match.group().encode('utf-8') #=> ひらがな
#Match Katakana
regex = u'[\u30A0-\u30FF]+' # == u'[ァ-ヾ]+'
match = re.search(regex, text, re.U)
print match.group().encode('utf-8') #=>カタカナ
Java 文字クラスは、探しているようなことを行います。\p hereで始まるものです。