2014-10-30 64 views
0

我想從字典中搜索其單詞是否在第二個txt文件中。 我有下面的代碼的問題:Python:帶字典,在另一個文本文件中搜索字符串並打印整行

print 'Searching for known strings...\n' 
with open('something.txt') as f: 
    haystack = f.read() 
with open('d:\\Users\\something\\Desktop\\something\\dictionary\\entirelist.txt') as f: 
    for needle in (line.strip() for line in f): 
     if needle in haystack: 
      print line 

的開放語句從我都沒有,我把他們從: Python: search for strings listed in one file from another text file? 我想打印行,所以我寫了行,而不是針。問題出現了:它說「線路未定義」。

我的最終目標是查看字典中的任何單詞是否在「something.txt」中,如果是,則打印單詞所在的行。 對不起,不好的英語或不好的問候,希望你能幫助我! Thx爲你的理解:)

+0

你可以給我們一個例子(剝離下來,比如說3行)什麼'something.txt'和'wholelist.txt'看起來像什麼,你想要什麼輸出? – abarnert 2014-10-30 00:56:45

回答

0

你問一下具體的例外,是因爲line並不發電機表達外存在。如果您要訪問它,你需要保持在同一範圍內print聲明,就像這樣:

for line in f: 
    needle = line.strip() 
    if needle in haystack: 
     print line 

但是,這不會是特別有用。這只是從needle加上最後的換行符。如果要打印haystack中包含needle的行(或行?),則必須搜索該行,而不僅僅詢問needle是否出現在整個haystack的任何位置。

要按字面順序執行所要求的操作,您需要遍歷haystack的行,並檢查每個行的needle。就像這樣:

with open('something.txt') as f: 
    haystacks = list(f) 

with open('d:\\Users\\something\\Desktop\\something\\dictionary\\entirelist.txt') as f: 
    for line in f: 
     needle = line.strip() 
     for haystack in haystacks: 
      if needle in haystack: 
       print haystack 

然而,有可能要考慮一個巧妙的方法:如果你可以編寫包括needle任何整條生產線相匹配的正則表達式,那麼你只需要打印出所有的火柴。就像這樣:

with open('something.txt') as f: 
    haystack = f.read() 
with open('d:\\Users\\something\\Desktop\\something\\dictionary\\entirelist.txt') as f: 
    for line in f: 
     needle = line.strip() 
     pattern = '^.*{}.*$'.format(re.escape(needle)) 
     for match in re.finditer(pattern, haystack, re.MULTILINE): 
      print match.group(0) 

這裏的正則表達式是如何工作的一個例子:

^.*Falco.*$ 

Regular expression visualization

Debuggex Demo

當然,如果你想搜索不區分大小寫的,或者只搜索完整的單詞等,你需要做一些小的改變;有關更多信息,請參閱Regular Expression HOWTO或第三方教程。

+1

您的第二個效果很好,第三個效果如下: <_sre.SRE_Match對象在0x022854B8> 另外我感興趣的是搜索不區分大小寫和完整的單詞,所以我會查看您的鏈接,單獨嘗試並查看會發生什麼:) 感謝您的幫助+提供替代方案:) – Maxim 2014-10-30 22:01:27

+0

@Maxim:對,對不起,'finditer'返回MatchObject's,不僅僅是匹配的字符串。哪一個更有用,但如果你想知道發生了什麼......那麼我已經編輯了答案。要使正則表達式不區分大小寫,您可以添加另一個標誌('re.MULTILINE | re.IGNORECASE')。爲了只匹配完整的單詞,如果你很幸運並且'\ b'具有你想要的單詞的相同定義,那很簡單;否則它會涉及更多一點。無論如何,肯定使用Debuggex或其他正則表達式工具來處理事情,這比使用源代碼的通常編輯 - 調試循環要容易得多。 – abarnert 2014-10-30 22:11:12

+0

再次感謝您! 你如何做到匹配具有相同定義的完整單詞? 另外我想檢查是否已打印行的str,如果是,則不打印。可能? – Maxim 2014-10-30 23:57:37

0

看起來你已經使用了一個生成器:(line.strip()在f中),我不認爲你可以從外部訪問內部變量的'行'發生器範圍,即在括號外。

試着這麼做:

for line in f: 
    if line.strip() in haystack: 
     print line 
+0

由於'line.strip()'只是一個字符串(字典中的一行,刪除了換行符),因此''對於針。strip():'就是這行中的每個字符。所以這不可能是正確的。 – abarnert 2014-10-30 01:11:38

+0

正確!修訂。 – fileoffset 2014-10-30 02:23:36

相關問題