【发布时间】:2008-10-16 22:26:09
【问题描述】:
如何在一个字符串中搜索多个单词?我希望逻辑运算为 AND,以便所有单词都在字符串中的某个位置。我有一堆废话段落和一个简单的英文段落,我想通过指定几个常用词来缩小范围,例如“the”和“and”,但希望它与我指定的所有词匹配。
【问题讨论】:
如何在一个字符串中搜索多个单词?我希望逻辑运算为 AND,以便所有单词都在字符串中的某个位置。我有一堆废话段落和一个简单的英文段落,我想通过指定几个常用词来缩小范围,例如“the”和“and”,但希望它与我指定的所有词匹配。
【问题讨论】:
正则表达式支持“环视”条件,可让您在字符串中搜索术语,然后忘记结果的位置;从下一个搜索词的字符串开头开始。这将允许以任何顺序在字符串中搜索一组单词。
这个的正则表达式是:
^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b)
其中\b 是单词边界,?= 是环视修饰符。
如果要搜索的单词数量不定,则需要使用循环构建此正则表达式字符串 - 只需将每个单词包装在环视语法中并将其附加到表达式中。
【讨论】:
(?=.*\bword\b)
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)
【讨论】:
也许使用language recognition chart 来识别英语会起作用。一些快速测试似乎有效(假设段落仅由换行符分隔)。
正则表达式将匹配其中任何一个条件... \bword\b 是由边界分隔的单词 word\b 是一个单词结尾,并且仅 word 将在要匹配的段落的任何位置匹配它。
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";
}
}
【讨论】:
首先,我不确定您要返回什么...整个句子?两个给定词之间的词?
类似:
\b(word1|word2)\b(\w+\b)*(word1|word2)\b(\w+\b)*\.
(其中\b 是您的语言中的单词边界)
将匹配包含两个单词中的一个或两者的完整句子..
你可能需要让它不区分大小写,这样如果它出现在句子的开头,它仍然会匹配
【讨论】:
假设 PCRE(Perl 正则表达式),我不确定您是否可以轻松做到这一点。 AND 操作是正则表达式的串联,但您希望能够排列单词出现的顺序,而不必正式生成排列。对于N个词,当N=2时,是可以忍受的; N = 3,勉强可以;当 N > 3 时,它不太可能被接受。因此,简单的迭代解决方案 - N 个正则表达式,每个单词一个,并迭代确保每个都满足 - 对我来说似乎是最佳选择。
【讨论】: