2012-02-15 183 views
0

如果其他單詞存在於同一文檔中,我的任務是查找包含某些單詞的文檔。有人措辭,我是這樣的:正則表達式匹配單詞(如果有其他單詞存在)

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

我一直在瞎搞的if/then正規表達式條件句,我不能完全弄清楚。這是我到目前爲止:

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

雖然這似乎並不適用於我。即使文件只包含'word2',它仍然匹配。

有什麼建議嗎?

+1

你僅限於使用Regex嗎?你使用什麼主要語言? – 2012-02-15 21:05:53

+0

除非(word1和word2)總會在(word3和word4)之前出現,否則有一個正則表達式可以解決這個問題,這似乎不必要的複雜。你能用編程語言做這樣的搜索嗎?這樣,它的一個簡單的(match1 && match2) - >文件被發現! – hexparrot 2012-02-15 21:06:10

+0

「word」是什麼意思?你的「單詞」中允許使用哪些字符? – 2012-02-15 21:16:32

回答

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 

如果你的文本可以包含新線,加上「點所有」修改正則表達式,這樣的點換行字符也匹配。這種語法的具體語法因語言而異,但通常它是在正則表達式分隔符後面寫的標誌「s」。但請檢查您正在使用的特定語言的文檔。


相反,我建議你將文檔拆分成單詞集合(例如列表或集合),然後使用普通代碼搜索集合。

+0

非常好的正則表達式演示,以及。 – hexparrot 2012-02-15 21:18:41

+0

我很害怕這個。我創建了腳本來讀取每個文件並掃描它以獲取我需要的內容,但速度很慢。我正在處理數千個我需要掃描的文件。 – 2012-02-15 21:38:30

0

您必須使用正則表達式與全球g修改集,搜索word1|word2通過字符(.|\n)*的任意組合從word3|word4分離。下面應該工作:

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

如果您使用的是Windows,你可能會想改變\n\r\n,由於不同的處理的新行字符。

+0

哼,我試過了,我似乎無法得到它與grep,egrep或grep -P一起工作。 – 2012-02-15 21:41:47

+0

是的,現在我意識到我忘記添加括號來區分正則表達式中的交替 – Win32 2012-02-15 21:45:38

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之類的東西作爲應對這些問題的更便攜的方式。

相關問題