在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

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的答案更好。

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不起作用。