Подтвердить что ты не робот

Регулярные выражения (regex) на японском языке

Я изучаю регулярные выражения (регулярное выражение) для английского языка, и хотя некоторые из концепций, похоже, применимы к другим языкам, таким как японский, я чувствую, что многие другие не будут. Например, обычное использование регулярных выражений состоит в том, чтобы найти, имеет ли слово не буквенно-цифровые символы. Я не вижу, как эта техника, как и другие, будет работать на японском языке, поскольку есть не только три системы письма, но и кандзи также очень сложны и охватывают гораздо больший диапазон, чем альфа-числовые символы. Я был бы признателен за любую информацию по этой теме, а также за области, которые нужно изучить, поскольку у меня очень мало знаний по этому вопросу, хотя я взял много японских курсов. Если это вообще возможно, я бы хотел, чтобы ваши ответы использовали python и Java, поскольку это языки, с которыми мне удобно. Благодарим вас за помощь.

4b9b3361

Ответ 1

Режимы Python предлагают ограниченную поддержку функций Unicode. Java лучше, особенно Java 7.

Java поддерживает категории Unicode. Например, \p{L} (и его сокращенное обозначение \pL) соответствует любой букве на любом языке. Это включает в себя японские идеографические персонажи.

Java 7 поддерживает сценарии Unicode, включая сценарии Hiragana, Katakana, Han и Latin, которые, как правило, состоят из японского текста. Вы можете сопоставить любой символ в одном из этих сценариев с помощью \p{Han}, \p{Hiragana}, \p{Katakana} и \p{Latin}. Вы можете объединить их в класс символов, например [\p{Han}\p{Hiragana}\p{Katakana}]. Вы можете использовать прописную букву P (как в, \p{Han}) для соответствия любому символу, кроме тех, что указаны в Han script.

Java 7 поддерживает блоки Unicode. Если вы не используете свой код на Android (где скрипты недоступны), вы должны избегать блоков, поскольку они менее полезны и точны, чем скрипты Unicode. Существует множество блоков, связанных с японским текстом, включая \p{InHiragana}, \p{InKatakana}, \p{InCJK_Unified_Ideographs}, \p{InCJK_Symbols_and_Punctuation} и т.д.

Как Java, так и Python могут ссылаться на отдельные кодовые точки, используя \uFFFF, где FFFF - любое четырехзначное начальное число. Java 7 может ссылаться на любую кодовую точку Unicode, включая те, которые находятся за пределами базовой многоязычной плоскости, используя, например, \x{10FFFF}. Режимы Python не поддерживают 21-разрядный Unicode, но строки Python делают, поэтому вы можете вставлять точку кода в регулярное выражение, например, \U0010FFFF (верхний регистр U, а затем восемь шестнадцатеричных цифр).

Флаг Java 7 (?U) или UNICODE_CHARACTER_CLASS делает сокращения класса символов похожими на \w и \d Unicode, поэтому они будут соответствовать японским идеографическим символам и т.д. (но обратите внимание, что \d все равно не будет соответствовать кандзи для чисел вроде 一二 三四). Python 3 делает по умолчанию сокращенные классы Unicode. В Python 2 классы сокращений являются Unicode, когда вы используете флаг re.UNICODE или re.U.

Вы правы, что не все идеи регулярных выражений переносятся одинаково хорошо ко всем сценариям. Некоторые вещи (например, обложка букв) просто не имеют смысла с японским текстом.

Ответ 2

Для Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re

kanji = u'漢字'
hiragana = u'ひらがな'
katakana = u'カタカナ'
str = kanji + hiragana + katakana

#Match Kanji
regex = u'[\u4E00-\u9FFF]+' # == u'[一-龠々]+'
match = re.search(regex, str, re.U)
print match.group().encode('utf-8') #=> 漢字

#Match Hiragana
regex = u'[\u3040-\u309Fー]+' # == u'[ぁ-んー]+'
match = re.search(regex, str, re.U)
print match.group().encode('utf-8') #=> ひらがな

#Match Katakana
regex = u'[\u30A0-\u30FF]+' # == u'[ァ-ヾ]+'
match = re.search(regex, str, re.U)
print match.group().encode('utf-8') #=>カタカナ

Ответ 3

Классы символов Java делают что-то вроде того, что вы ищете. Это те, которые начинаются с \p здесь.

Ответ 4

В Unicode есть два способа классификации символов из разных систем письма. Они

  • Скрипт Unicode (все символы, используемые в скрипте, независимо от кодовых точек Unicode - могут быть из разных блоков)
  • Блок Unicode (диапазоны кодовых точек, используемые для определенной цели/сценария - могут охватывать разные сценарии, а сценарии - разные блоки)

Различия между ними более четко объяснены на этой веб-странице официального веб-сайта Unicode.

С точки зрения соответствия символов в регулярных выражениях в Java, вы можете использовать любой механизм классификации начиная с Java 7.

Это синтаксис, указанный в этом руководстве с веб-сайта Oracle:

Сценарий:

либо \p{IsHiragana}, либо \p{script=Hiragana}

Блок:

либо \p{InHiragana}, либо \p{block=Hiragana}

Обратите внимание, что в одном случае это "есть", а в другом - "В".

Синтаксис \p{Hiragana}, указанный в принятом ответе, кажется недопустимым. Я попробовал это на всякий случай, но могу подтвердить, что это не сработало для меня.