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

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

3 ответов


Python regexes предлагает ограниченную поддержку функций 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}), чтобы соответствовать любому символу, кроме тех, в сценарии Han.

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

как Java, так и Python могут ссылаться на отдельные кодовые точки с помощью \uFFFF, где FFFF - любое четырехзначное число headecimal. Java 7 может ссылаться на любую кодовую точку Unicode, в том числе за пределами базовой многоязычной плоскости, используя, например,\x{10FFFF}. Python regexes не поддерживают 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 флаг.

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


Для 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') #=>カタカナ

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