2012-02-26 83 views
0

我有一个函数 - 作为不同程序的一个较大部分 - 检查单词条目是否在文本文件中。因此,如果文本文件看起来像这样:需要完整地匹配整个单词,而不使用Python中的部分

aardvark 
aardvark's 
aardvarks 
abaci 
. 
. 
. 
zygotes 

我只是跑一个快速的if语句

infile = open("words","r") # Words is the file with all the words. . . yeah. 
text = infile.read() 

if word in text: 
    return 1 
else: 
    return 0 

作品,排序的。问题是,虽然它对Aardvark返回真,而对于wj; ek则为false,对于任何单词的任何SUBSET它也将返回true。因此,例如,rdva这个词将作为一个“单词”返回,因为它在文件中,作为防御的一个子集。我只需要它匹配整个单词,我一直很难过。

那么我怎么能让它匹配整个单词(这相当于整条线)呢,还是什么都没有?

我很抱歉如果这个问题在其他地方回答,我搜索之前,我张贴!

非常感谢!

回答

2

遍历每一行,看看整条生产线相匹配:

def in_dictionary(word): 
    for line in open('words', 'r').readlines(): 
    if word == line.strip(): 
     return True 

    return False 
  • 当您使用in语句,你基本上是问这个词是否在行
  • 使用==匹配整行。
  • .strip()删除了前部和尾部的空格,这将导致hello不等于{space}hello
+0

这很聪明,我想用它,但for循环是通过字母而不是单词通过文件。 。 。任何方式我可以指定它在哪里打破?在返回而不是字符? – Terrik 2012-02-26 05:40:00

+0

我的不好。现在尝试一下(注意最后的'.readlines()')。 – Blender 2012-02-26 05:41:11

+0

太棒了,非常感谢搅拌机!完美工作。 – Terrik 2012-02-26 05:44:57

0

Blender的答案的作品,但在这里是不要求你重复自己不同的方式:

每一行将以换行符(\n)结束。所以,你可以做的是在比较时在你选中的字符串之前和之后放置一个\n。因此,像这样:

infile = open("words","r") # Words is the file with all the words. . . yeah. 
text = "\n" + infile.read()  # add a newline before the file contents so we can check the first line 

if "\n"+word+"\n" in text: 
    return 1 
else: 
    return 0 

小心,虽然 - 你行结束可能是\r\n或只是\r过。

如果您正在检查的单词包含换行符,它也可能有问题。 Blender的答案更好。

+1

我不认为任何正常的单词都包含换行符;) – Blender 2012-02-26 05:20:55

+0

你假设他在将自己的检查词加入他的功能时防止了这种可能性。 – chroipahtz 2012-02-26 05:40:29

1

有一个更简单的方法。你的文件在概念上是一个单词列表,所以建立单词列表(而不是单个字符串)。

with open("words") as infile: words = infile.read().split() 
return word in words 

<string> in <string>做一个字符串搜索,但<anything> in <list>检查会员。如果您要对同一个单词列表进行多次检查,则可以通过改为存储单词set(仅将该列表传递给set构造函数)来提高性能。

0

这些都很棒,直到您想要使用该列表来验证长文本中的每个单词。对于我和/usr/share/dict/words,最多需要3ms来检查单个word in words。因此,我建议使用字典(不是双关语)来代替。查找大约快了2.5万倍:

words = {} 
for word in open('words', 'r').readlines(): 
    words[word.strip()] = True 

def find(word): 
    return word in words 
相关问题