Я изучаю регулярные выражения (регулярное выражение) для английского языка, и хотя некоторые из концепций, похоже, применимы к другим языкам, таким как японский, я чувствую, что многие другие не будут. Например, обычное использование регулярных выражений состоит в том, чтобы найти, имеет ли слово не буквенно-цифровые символы. Я не вижу, как эта техника, как и другие, будет работать на японском языке, поскольку есть не только три системы письма, но и кандзи также очень сложны и охватывают гораздо больший диапазон, чем альфа-числовые символы. Я был бы признателен за любую информацию по этой теме, а также за области, которые нужно изучить, поскольку у меня очень мало знаний по этому вопросу, хотя я взял много японских курсов. Если это вообще возможно, я бы хотел, чтобы ваши ответы использовали python и Java, поскольку это языки, с которыми мне удобно. Благодарим вас за помощь.
Регулярные выражения (regex) на японском языке
Ответ 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}
, указанный в принятом ответе, кажется недопустимым. Я попробовал это на всякий случай, но могу подтвердить, что это не сработало для меня.