Regex поиск по нескольким словам - PullRequest
6 голосов
/ 17 октября 2008

Что я использую для поиска нескольких слов в строке? Я хотел бы, чтобы логическая операция была И, чтобы все слова были где-то в строке. У меня есть куча бессмысленных абзацев и один простой английский абзац, и я хотел бы сузить его, указав пару общих слов, таких как «the» и «and», но хотел бы, чтобы он совпадал со всеми указанными мной словами.

Ответы [ 5 ]

11 голосов
/ 06 ноября 2008

Регулярные выражения поддерживают условие «обхода», которое позволяет вам искать термин в строке и затем забывать местоположение результата; начиная с начала строки для следующего поискового запроса. Это позволит искать строку для группы слов в любом порядке.

Регулярное выражение для этого:

^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b)

Где \b - граница слова, а ?= - модификатор обхода.

Если у вас есть переменное число слов, которые вы хотите найти, вам нужно будет построить эту строку регулярного выражения с помощью цикла - просто оберните каждое слово в синтаксисе поиска и добавьте его в выражение.

2 голосов
/ 17 октября 2008

Может быть, с помощью таблицы распознавания языка для распознавания английского языка будет работать. Некоторые быстрые тесты работают (это предполагает, что абзацы разделены только новыми строками).

Регулярное выражение будет соответствовать одному из этих условий ... \ bword \ b - слово, разделенное границами, слово \ b - слово, оканчивающееся словом, и просто слово будет соответствовать ему в любом месте сопоставляемого абзаца. *

my @paragraphs = split(/\n/,$text);
for my $p (@paragraphs) {
    if ($p =~ m/\bthe\b|\band\b|\ban\b|\bin\b|\bon\b|\bthat\b|\bis\b|\bare\b|th|sh|ough|augh|ing\b|tion\b|ed\b|age\b|’s\b|’ve\b|n’t\b|’d\b/) {
       print "Probable english\n$p\n";
    }
}
2 голосов
/ 17 октября 2008

Во-первых, я не уверен, что вы пытаетесь вернуть ... целое предложение? Слова между вашими словами?

Что-то вроде:

\b(word1|word2)\b(\w+\b)*(word1|word2)\b(\w+\b)*\.

(где \b - граница слова в вашем языке) будет соответствовать полному предложению, содержащему одно из двух слов или оба.

Вам, вероятно, нужно сделать его нечувствительным к регистру, чтобы, если оно появилось в начале предложения, оно все равно совпадало

2 голосов
/ 17 октября 2008

AND как конкатенация

^(?=.*?\b(?:word1)\b)(?=.*?\b(?:word2)\b)(?=.*?\b(?:word3)\b)

OR как чередование

^(?=.*?\b(?:word1|word2|word3)\b
^(?=.*?\b(?:word1)\b)|^(?=.*?\b(?:word2)\b)|^(?=.*?\b(?:word3)\b)
0 голосов
/ 17 октября 2008

Предполагая PCRE (регулярные выражения Perl), я не уверен, что вы можете сделать это вообще легко. Операция AND - это объединение регулярных выражений, но вы хотите иметь возможность переставлять порядок появления слов без необходимости формальной генерации перестановки. Для N слов, когда N = 2, это терпимо; с N = 3 все в порядке; при N> 3 это вряд ли будет приемлемым. Таким образом, простое итеративное решение - N регулярных выражений, по одному на каждое слово, и повторение, гарантирующее, что каждое из них удовлетворено - выглядит для меня лучшим выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...