【问题标题】:Find words in long string in Python在 Python 中查找长字符串中的单词
【发布时间】:2016-05-28 07:41:25
【问题描述】:

我想找到一种有效的方法来查找文件中的单词,然后与没有空格的长字符串行进行比较以查找这些单词:

Example:
FileOfWords.txt
  THE
  HOUSE
  DOG
  ON
  LINE

  string1 = " ASASASASASATHEHFGFDFGDFDFDDOGFDFDF"
  string2 = "DOGLINEJSDKJSDJKSDKJSDTHECVCVVCV"
  string3 = "UHFDUIHKDFSHUIDSFUIHDSFHUSDSHUIS"

  compare words in FileOfWords.txt to string

  Output:
  Words in string1 found: THE, DOG
  Words in string2 found: DOG, LINE
  Words in string3 found:

最好的方法是什么?

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布代码并准确描述问题之前,我们无法有效地帮助您。 StackOverflow 不是编码或教程服务。
  • 你说得对,我应该有,但 Alessiox 已经发布了我正在寻找的功能。不过,我将来会这样做。谢谢

标签: python string


【解决方案1】:

最直观的方法是使用蛮力方法,即寻找长度为 k 的每个子字符串(k-mer)(其中 k 从 1到字符串本身的长度)并检查这样的子字符串是否在您的文件中。

首先要做的是定义一个函数(生成器),它返回所有可能的 k-mer:

def all_kmers(sequence, k):
    for i in range(len(sequence) - k + 1):
        yield sequence[i:i + k]

现在是时候导入文件和你的三个字符串了:

# open the file, import its lines thanks to readlines() and then close it
fileIN=open('FileOfWords.txt','r')
myWords=fileIN.readlines()
fileIN.close()

# remove newline tags
for id in range(len(myWords)):
    myWords[id]=myWords[id].strip()

# load the strings
string1 = " ASASASASASATHEHFGFDFGDFDFDDOGFDFDF"
string2 = "DOGLINEJSDKJSDJKSDKJSDTHECVCVVCV"
string3 = "UHFDUIHKDFSHUIDSFUIHDSFHUSDSHUIS"

现在是时候摇滚了:

print "In string 1:"
for k in range(len(string1)):
    for kmer in all_kmers(string1, k):
        if kmer in myWords:
            print kmer

print "\nIn string 2:"
for k in range(len(string2)):
    for kmer in all_kmers(string2, k):
        if kmer in myWords:
            print kmer

print "\nIn string 3:"
for k in range(len(string3)):
    for kmer in all_kmers(string3, k):
        if kmer in myWords:
            print kmer

这样的代码返回:

In string 1:
THE
DOG

In string 2:
DOG
THE
LINE

In string 3:

注意:通过将三个字符串包含在一个列表中,您可以避免 3 个单独的步骤,并将所有内容包含在一个贯穿该列表的唯一循环中。
所以基本上在字符串定义之后,代码是:

myList=[string1,string2,string3]

for l in range(len(myList)):
    StringUnderTest=myList[l]
    print "String #"+str(l+1)
    for k in range(len(StringUnderTest)):
        for kmer in all_kmers(StringUnderTest, k):
            if kmer in myWords:
                print kmer
    print

这样的代码返回

String #1
THE
DOG

String #2
DOG
THE
LINE

String #3

【讨论】:

  • 谢谢 Alessiox,all_kmers 函数正是我所需要的!
  • 请注意,这不是一个“标准”函数,而是一个生成器。如您所见,我使用 for 循环遍历 all_kmers 生成的结果。
【解决方案2】:

一种简单的方法是将字符串加载到列表中。并使用两个嵌套循环进行搜索:

strings = [" ASASASASASATHEHFGFDFGDFDFDDOGFDFDF","DOGLINEJSDKJSDJKSDKJSDTHECVCVVCV","UHFDUIHKDFSHUIDSFUIHDSFHUSDSHUIS"]

words = ['THE','HOUSE','DOG','ON','LINE']


for i,string in enumerate(strings):
    result = "Words in String{0} found: ".format(i+1)
    for word in words:
        idx = string.find(word)
        if idx != -1:
            result += word +', '

    print(result[:-2])

或根据@guiscri 的回答从文本文件中加载单词

【讨论】:

    【解决方案3】:

    一个简单的方法很简单

    • 读取文件
    • 逐字检查该单词是否为in较大的字符串

    也就是说,

    with open(fname) as f:
        wrds = f.read().strip().split('\n')
    
    mtches = [[] for x in range(3)]
    
    for w in wrds:
        if w in string1: mtches[0].append(w)
        if w in string2: mtches[1].append(w)
        if w in string3: mtches[2].append(w)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 2022-01-01
      • 2015-12-05
      相关资源
      最近更新 更多