Как расставить приоритеты для регулярных выражений | (Или) выражения? - PullRequest
2 голосов
/ 21 августа 2011

Я пытаюсь сопоставить соединения кандзи в японском предложении, используя регулярное выражение.

Прямо сейчас я использую / ((.)*) / для сопоставления соединения с пробелом, например, 彼はそこに ひと人 でいた。

Проблема в том, что в каком-то предложении слово стоит в начале или сопровождается знаками препинания. Ex. いっ瞬 の間が生まれた。 или 一昨じつ、彼らはそこを出発した。

Я пробовал что-то вроде / ((.)*) |^((.)*) | ((.)*)、 etc. Но это соответствует 彼はそこに ひと人 вместо ひと人 в 彼はそこに ひと人 でいた。

Можно ли как-нибудь упаковать все это в одно регулярное выражение, или мне нужно использовать одно, проверить, вернул ли он что-нибудь, а затем попробовать другое, если нет?

Спасибо!

P.S .: Я использую PHP для разбора предложений.

Ответы [ 4 ]

1 голос
/ 21 августа 2011

Предполагая, что вы вводите в формате UTF-8, вы можете попробовать набрать

'/(\pL+)/u'

. \pL+ соответствует одной или нескольким буквам в строке.

Пример:

$str = '彼はそこに ひと人 でいた。';

preg_match_all('/(\pL+)/u', $str, $matches);

var_dump($matches[0]);

Вывод:

array(3) {
  [0]=>
  string(15) "彼はそこに"
  [1]=>
  string(9) "ひと人"
  [2]=>
  string(9) "でいた"
}
1 голос
/ 21 августа 2011

Я думаю, что это: /([^ 、]+)/ должно соответствовать словам в приведенных вами примерах (вы можете добавить некоторые другие завершающие слова символы кроме пробела и 、, если они есть в ваших текстах (или использовать \pLвместо [^ 、] для покрытия всех букв UTF.

ПРИМЕР

<?                                                                                                                                                          
preg_match_all('/[^ 、]+/u', "彼らは日本の 国民 となった。", $m);
print_r($m);

вывод

Array
(
    [0] => Array
        (
            [0] => 彼らは日本の
            [1] => 国民
            [2] => となった。
        )
)
0 голосов
/ 22 августа 2011

Подумав об этом в течение длительного времени, я считаю, что невозможно проанализировать соединения, не разделяя их все пробелами или другими символами, что я и делаю сейчас :)

Ex. если предложение 私は ノート、ペンなどが必要だ。, компьютер не может узнать, является ли он правильным выбором: 私は (начальное предложение и разделитель пробелами) или ノート (разделитель пробелом и запятая).

Спасибо всем за ваши предложения ...

0 голосов
/ 21 августа 2011

вы пытаетесь только разбить вашу строку по некоторому шаблону (пробел или пунктуация), это правда ??как насчет этого?

In [51]: word = '.test test\n.test'
In [53]: re.split('[\s,.]+',word)
Out[53]: ['', 'test', 'test', 'test']
...