正则表达式匹配单词,如果存在其他单词

时间:2012-02-15 21:02:33

标签: regex

我的任务是找到包含某些单词的文档,如果同一文档中存在其他单词。我这样措辞:

Contains word1 or word2 within the same document as word3 or word4

我一直在乱用if / then条件为regexp,我无法弄明白。以下是我到目前为止的情况:

(?(word3|word4)(word1|word2)|())

这似乎对我不起作用。即使文档只包含'word2',它仍然匹配。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您可能希望避免使用正则表达式。单独使用正则表达式编写它是相当尴尬的,但可以使用前瞻:(Rubular

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

或者列出所有排列(这里不太难,但很快就会失去更复杂的例子):( Rubular

\b(?:word1|word2)\b.*\b(?:word3|word4)\b|\b(?:word3|word4)\b.*\b(?:word1|word2)\b

如果文本可以包含新行,请将“dot all”修饰符添加到正则表达式,以使该点也与新行字符匹配。具体语法因语言而异,但通常是在正则表达式分隔符后面写的标志“s”。但请查看文档以了解您使用的特定语言。


相反,我建议您将文档拆分为单词集合(例如列表或集合),然后使用普通代码搜索集合。

答案 1 :(得分:0)

您必须使用具有全局g修饰符集的正则表达式,该修饰符集通过任意字符组合word1|word2搜索与word3|word4分隔的(.|\n)*。以下应该有效:

(((word1|word2)(.|\n)*(word3|word4))|((word3|word4)(.|\n)*(word1|word2)))

如果您使用的是Windows,由于对新换行符的处理方式不同,您可能希望更改\n \r\n

答案 2 :(得分:0)

也许我误解了这个问题,但如果/word1|word2/ && /word3|word4/两者都匹配,你想要的只是它是真的吗?

似乎很简单。命令行中的一个简单演示是:

$ perl -0777 -ne 'print "$ARGV\n" if /word1|word2/ && /word3|word4/' file1 file2 file3 ... file9999999

将打印该条件所适用的所有文件名的列表。

它也会比你在Python中可能做的任何事情都要快得多,因为Perl在语言中内置了模式匹配,而不是作为库固定。例如,Perl将把一堆替代品优化成Aho-Corasick trie数据结构,这比Boyer-Moore真正快速通过数据超快速数据结构更快。我建议你动态地构建你的模式并利用这个模型。

您可能希望在模式中添加/s/m次切换,具体取决于您希望如何处理换行符等。您还可以使用\N\R之类的内容来处理这些内容。