Regex для PHP.Поиск слов и возврат данных после слов - PullRequest
1 голос
/ 30 апреля 2011

Я пытаюсь сделать регулярное выражение для работы, о которой меня просили, но мне не повезло, что она стала достаточно эффективной.
Цель состоит в том, чтобы сделать следующее максимально эффективным.
Цель № 1. Разделяйте весь текст, используя окончание предложения (точка, 3 точки, восклицательный знак ...).
Задача № 2 Получить все числа, которые появляются после строки 'em'
Вот пример возможной маленькой строки и регулярного выражения для нее. (настоящий может быть действительно худж)
Регулярное выражение: старый:
(?:[^.!?:]|...)(?:(?:[^.!?:]|...)*?em (\d+))*
новый:
(?:[.!?]|[.][.][.])(?:(?:[^.!?]|[.][.][.])*?\bem\b (\d+))*

работает на строку (я только что придумал)
(Я вставляю. В начале)

. То, что надо, - это баталья в 1939 году. Claro que a data que digo ser em 1939 - Uma Farsa. Em 1938 г. (вставьте EM 1910)

То, что я хотел, это сделать регулярное выражение, которое не будет возвращаться назад, поскольку ему просто не нужно возвращаться назад. Сделав так, я думаю, я смогу сэкономить на обработке, которая требует, например, ... сокращения с 30 секунд до 20 секунд или даже до 10 секунд! Только для этого1 требуется 1 с.
Добавить:
Спасибо за ответы теперь у меня есть тот, который не подведет. Но все-таки он слишком много откатывает назад. Любые решения?

Добавить (чтобы ответить на один удаленный вопрос):
К сожалению, у меня нет образцов данных. Кто попросил меня сделать это, тот сказал, что у него также нет образцов данных, но это нужно сделать «до вчерашнего дня». Если вы дадите мне что-то, что работает с этим текстом настолько эффективно, насколько это возможно, я уверен, что смогу работать с ним и скрытно, если понадобится что-то конкретное для этой работы. Иначе я спрошу здесь снова.

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Хотя вопрос запутанный, похоже, у вас есть две разные задачи, которые лучше всего выполнять с двумя разными регулярными выражениями. Вот протестированный скрипт, который делает то, что (я предполагаю) вы хотите:

<?php // test.php 20110430_1100
    // Test data.
    $text = 'Foi visto que a batalha em 1939 foi. Claro'.
        ' que a data que digo ser em 1939 é uma farsa. E'.
        'm 1938 já (insert em 1910) não havia reis.';

    // Part 1: Find all numbers after "em".
    $re1 = '/\bem\b\s*(\d+)\b/i';
    $count = preg_match_all($re1, $text, $matches);
    if ($count) $numbers = $matches[1]; // Array of number strings.
    else        $numbers = array();     // Else no numbers found.

    // Part 2: Split text into sentences.
    $re2 = '/(?<=[.!?])\s+/';
    $sentences = preg_split($re2, $text, -1, PREG_SPLIT_NO_EMPTY);

    // Print out results.
    $ncnt = count($numbers); // Count of numbers found.
    printf("There were %d numbers following \"em\".\n", $ncnt);
    for ($i = 0; $i < $ncnt; ++$i) {
        printf("  Number[%d] = %s\n", $i + 1, $numbers[$i]);
    }
    $scnt = count($sentences); // Count of sentences found.
    printf("\nThere were %d sentences found.\n", $scnt);
    for ($i = 0; $i < $scnt; ++$i) {
        printf("  Sentence[%d] = \"%s\"\n", $i + 1, $sentences[$i]);
    }
?>

Вот вывод из скрипта.

There were 4 numbers following "em".
Number[1] = 1939
Number[2] = 1939
Number[3] = 1938
Number[4] = 1910

There were 3 sentences found.
Sentence[1] = "Foi visto que a batalha em 1939 foi."
Sentence[2] = "Claro que a data que digo ser em 1939 é uma farsa."
Sentence[3] = "Em 1938 já (insert em 1910) não havia reis."

0 голосов
/ 30 апреля 2011

Я не буду отвечать о производительности, но:

  • вы не должны использовать «...» для соответствия ... но «...» (в противном случае вы соответствуете любой последовательности3 символа).Обратите внимание, что это может значительно улучшить вашу работу.
  • Я не говорю на этом языке (испанский), но я думаю, что вы хотите соответствовать только слову "em", а не окончанию (например, balahem 1930 будет соответствовать),
  • вы не должны предполагать, что у вас есть только один пробел между 'em' и вашим номером: Em__1950 (заменить _ пробелом) не будет соответствовать

РЕДАКТИРОВАТЬ : О перфе: сопоставление чего-либо (.) Внутри блока повторения заставляет двигатель довольно долго двигаться вперед и назад: если вы можете сопоставить явные шаблоны, это всегда будет намного быстрее.

...