2011-04-27 160 views
4

我想檢查文檔中是否包含某個特定術語。但是,有時,這個詞有幾種形式(複數,過去時等)。如何在Python中使用通配符創建搜索條件?

'Hello Worlds' 
'Hellos Worlds' 
'Jello World' 
'Hello Worlded' 

如何創建一個搜索項,它會發現所有實例如

'*ello* World*' 

其中的明星是持外卡並不一定必須包含在字裏。

我找到了一個fnmatch模塊的文檔,但是我看不出如何能夠幫助我搜索文檔。

+0

聽起來像是你可能想單詞詞根或一些NLTK的東西... – Daenyth 2011-04-27 19:45:39

回答

6

使用正則表達式,只是遍歷文件:

import re 
f=open('test.file.here', 'r') 

pattern = re.compile("^[^\s]*ello[^\s]*\sWorld[^\s]*$") 

for line in f: 
    if pattern.match(line): 
    print line, 

f.close() 
+0

非常感謝@photoionized。這正是我所期待的。 – coderman 2011-04-27 19:50:23

3

的*語法,描述被稱爲globbing。它不適用於文檔,只是文件和目錄。正如其他人所指出的那樣,正則表達式就是答案。

+1

除了fnmatch'的'存在。 – 2011-04-27 19:48:31

+1

根據[文檔](http://docs.python.org/library/fnmatch.html)的fnmatch是指用於在文件名中使用。 – 2011-04-27 20:14:14

+0

它使用「文件名」作爲參數非常多,但無處它說,這是*僅*有關文件名使用。 – 2011-04-27 20:16:18

2

如果你正在做什麼複雜的,正則表達式是要走的路。如果你不滿意這些,我認爲對於你的具體問題你也可以使用「in」。例如:

x = 'hello world' 
if 'ello' in x and 'world' in x': 
    print 'matches' 
else: 
    print 'does not match' 
1

正則表達式通常是更好的,但如果由於某種原因,你要堅持通配符格式,你可以這樣做:

from fnmatch import fnmatch 

pattern = '*ello* World*' 

with open('sample.txt') as file: 
    for line in f: 
     if fnmatch(line, pattern): 
      print(line)