Как расставить приоритеты регулярных выражений | (Или) выражения?
Я пытаюсь сопоставить соединения кандзи в японском предложении с помощью регулярных выражений.
Щас пользуюсь / ((.)*) /
чтобы соответствовать соединению, разделенному пробелом, например, в 彼はそこに ひと人 でいた。
Проблема в том, что в каком-то предложении слово стоит в начале или сопровождается знаками препинания. Ex. いっ瞬 の間が生まれた。
или же 一昨じつ、彼らはそこを出発した。
Я пробовал что-то вроде / ((.)*) |^((.)*) | ((.)*)、 etc.
Но это соответствует 彼はそこに ひと人
вместо ひと人
в 彼はそこに ひと人 でいた。
Можно ли как-нибудь упаковать все это в одно регулярное выражение, или мне нужно использовать одно, проверить, возвращало ли оно что-нибудь, а затем попробовать другое, если нет?
Спасибо!
PS: я использую PHP для разбора предложений.
4 ответа
Подумав об этом в течение долгого времени, я считаю, что невозможно проанализировать соединения, не разделяя их все пробелами или другими символами, что я и делаю сейчас:)
Ex. если предложение 私は ノート、ペンなどが必要だ。
компьютер никак не может узнать, 私は
(начальное предложение и пробел) или ノート
(пробел и запятая), это право, которое он должен выбрать.
Спасибо всем за ваши предложения...
Предполагая, что ваш ввод в 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) "でいた"
}
Я думаю это: /([^ 、]+)/
должны соответствовать словам в приведенных вами примерах (вы можете добавить некоторые другие завершающие слова символы кроме пробела и 、, если они есть в ваших текстах (или использовать \pL
вместо [^ 、]
чтобы покрыть все буквы UTF.
ПРИМЕР
<?
preg_match_all('/[^ 、]+/u', "彼らは日本の 国民 となった。", $m);
print_r($m);
выходы
Array
(
[0] => Array
(
[0] => 彼らは日本の
[1] => 国民
[2] => となった。
)
)
Вы пытаетесь только разбить вашу строку по некоторому шаблону (пробел или пунктуация), это правда?? как насчет этого?
In [51]: word = '.test test\n.test'
In [53]: re.split('[\s,.]+',word)
Out[53]: ['', 'test', 'test', 'test']