在Python中,需要完全匹配长集合中的整个单词,而不需要任何部分
我有一个函数,作为不同程序的一个较大部分,它检查文本文件中是否有单词条目。因此,如果文本文件如下所示:在Python中,需要完全匹配长集合中的整个单词,而不需要任何部分,python,substring,Python,Substring,我有一个函数,作为不同程序的一个较大部分,它检查文本文件中是否有单词条目。因此,如果文本文件如下所示: 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 els
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返回true,wj返回false;对于任何单词的任何子集,它也将返回true。因此,例如,单词rdva将作为“单词”返回,因为它在文件中,作为aardvark的子集。我需要它来匹配整句话,我已经被难倒了
那么我如何让它匹配一个完整的单词(这里相当于一整行),或者什么都不匹配呢
我很抱歉,如果这个问题在其他地方得到了回答,我在发布之前搜索过
非常感谢 迭代每一行,查看整行是否匹配:
def in_dictionary(word):
for line in open('words', 'r').readlines():
if word == line.strip():
return True
return False
- 当您在语句中使用
时,基本上是在询问单词是否在行中
- 使用
匹配整行==
删除前导和尾随空格,这将导致.strip()
不等于hello
{space}hello
def in_dictionary(word):
for line in open('words', 'r').readlines():
if word == line.strip():
return True
return False
- 当您在语句中使用
时,基本上是在询问单词是否在行中
- 使用
匹配整行==
删除前导和尾随空格,这将导致.strip()
不等于hello
{space}hello
\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的答案更好。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的答案更好。有一种更简单的方法。从概念上讲,您的文件是一个单词列表,因此构建该单词列表(而不是单个字符串)
中的执行子字符串搜索,但中的检查成员资格。如果要对同一个单词列表进行多次检查,则可以通过存储单词的集来提高性能(只需将列表传递给集构造函数即可)。有一种更简单的方法。从概念上讲,您的文件是一个单词列表,因此构建该单词列表(而不是单个字符串)
中的执行子字符串搜索,但中的检查成员资格。如果要对同一个单词列表进行多次检查,则可以通过存储单词的集来提高性能(只需将列表传递给集构造函数即可)。这非常好,直到您想使用该列表验证较长文本中的每个单词为止。对于我和/usr/share/dict/words
,在words
中检查单个单词需要3毫秒的时间。因此,我建议改用字典(不要双关语)。在以下情况下,查找速度提高了约2.5千倍:
words = {}
for word in open('words', 'r').readlines():
words[word.strip()] = True
def find(word):
return word in words
这一切都很好,直到您想使用该列表验证较长文本中的每个单词。对于我和/usr/share/dict/words
,在words
中检查单个单词需要3毫秒的时间。因此,我建议改用字典(不要双关语)。在以下情况下,查找速度提高了约2.5千倍:
words = {}
for word in open('words', 'r').readlines():
words[word.strip()] = True
def find(word):
return word in words
我认为任何普通的词都不包含新词;)你假设他在函数中输入检查词时是在防止这种可能性。我认为任何正常的词都不包含换行符;)你假设他在将校验字输入到函数中时正在防止这种可能性。这很聪明,我想使用它,但for循环是按字母而不是按单词遍历文件的。我可以指定它在哪里断开吗?At返回而不是字符?实际上,在默认情况下,对文件对象的迭代会对行进行迭代.readlines()
是冗余的。要按字符浏览文件,您必须先显式地read()
它(从而发现自己一次迭代一个字符串一个字符)。我最初打开了for行(…):
行,但由于某些原因,@Terrik不起作用。这很聪明,我想使用它,但是for循环是按字母而不是单词来遍历文件的。我可以指定它在哪里断开吗?At返回而不是字符?实际上,在默认情况下,对文件对象的迭代会对行进行迭代.readlines()
是冗余的。要按字符遍历文件,您必须先显式地read()
它(从而发现自己一次迭代一个字符串一个字符)。我最初在open(…)中有for行:
行,但出于某种原因,@Terrik不起作用。