如何查找文件/字符串中字符串之间的字符串数 - python

时间:2016-02-03 13:43:23

标签: python string file python-3.x find

*********************************** SOLUTION *********** *****************

经过大量的测试和一些调整后,我设法编写了一个有效的代码!

我与所有人分享,以防有人有兴趣执行我所拥有的相同的事情。 对每个帮助过的人 - 谢谢! :)

stringToSearchIn = open('FileName.py').read()

def findBetween(file, firststring, laststring, findstring):
    start = 0
    countfinal = 0
    while True:
        try:
            start = file.index(firststring, start)
        except:
            break
        try:
            end = file.index(laststring, start)
            count = file[start:end].count(findstring)
            countfinal = count + countfinal
            start = end
        except:
            break
     return countfinal

print findBetween(stringToSearchIn, "example", "file", "letters")

*********************************结束解决方案************ ***************

我一直试图解决这个问题已经有一段时间了,我相信我在脑海中复杂的事情。 我写作甚至有点复杂,但我会尽我所能。如果事情不清楚,请随意提问!

请不要为我编写代码。我在这里学习,而不是复制:)

例如:

#This is the entire text I want to scan
      s = open('test.py').read()
#I want to go through the entire file and find the string between these two strings:
     stringStartToSearch = "example" 
     stringEndToSearch = "file"
#Next, I want to count the number of times a certain string is located 
#between the previously found string.
     stringSearch = "letters"

为了进一步说明,让我们说这是" test.py"中的字符串。文件:

#An example text that I have many letters in, just to give and example for a file.
#It's an example with many letters that I made especially for this file test.
#And these are many letters which should not be counted

如您所见,单词"字母"可以在这个文件中找到3次,但只有2次"例如"和"文件" 。这就是我想要的数字。

有没有人知道有效的pythonic方法来实现这一目标?

非常感谢!

为了你sabbahillel

脚本确实在2个给定字符串之间找到正确的字符串,但是在找到它之后停止。我需要它来继续搜索整个文件,而不是在它找到后停止。 此外,在我找到这两个字符串之间的字符串后,我需要通过它来计算某个单词的显示次数。用这个命令可以实现吗?

file = open('testfile.py').read()

def findBetween(file, firstWord, secondWord):
        start = file.index(firstWord)+len(firstWord)
        end = file.index(secondWord, start)
        return file[start:end]

print findBetween(file, "example", "file")

2 个答案:

答案 0 :(得分:1)

我们假设您已经提供了字符串列表。

Python Lists

list.index(x)的

返回值为x的第一个项目列表中的索引。如果没有这样的项目,则会出错。

获取开始的索引和结束的索引。如果begin和end都存在且end的索引大于start的索引,则只需使用start和end索引上的范围来获取所需的元素。

当然,您必须进行相应的错误检查,并决定如果您有一个开始指示符但要到达列表末尾没有结束指示符该怎么办(作为必须处理的错误情况的示例) )

请注意,list.index()会查找起始字符串的第一个匹配项。如果还有更多,则在结束字符串第一次出现时启动范围并再次执行。这可以在适当的do ... while循环中完成,其中while检查是否有另一个出现的起始字符串。

请注意,如果列表中出现另一个起始字符串,则不会将其视为重置开始,而只是另一个条目。

mylist = ('string' 'start' 'string' 'start' 'string' 'end' 'string)

将处理

('start' 'string' 'start' 'string' 'end')

因此我们现在有了

start = 0

while True:
    try:
        start = mylist[start:].index(firststring)
    except:
        # index did not find start string. nothing to do, force exit
        break
    try:
        end = mylist[start:].index(laststring)
        count = mylist[start:end].count(findstring)
        # process findstring
        start = end # set up for the next loop
    except:
        # index did not find end string but did find start
        count = mylist[start:].count(findstring)
        # process findstring
        break # reached the end of the list, exit the while

现在你有了开始和结束索引

索引,切片和矩阵

因为列表是序列,所以索引和切片对列表的工作方式与对字符串的工作方式相同。所以只需使用list [a:b] .count(string)和相应的切片指示符..

list.count(OBJ)

返回列表中obj出现次数的计数

答案 1 :(得分:0)

使用regexp进行查找:

import re

example = """An example text that I have many letters in, just to give and example for a file.
It's an example with many letters that I made especially for this file test.
And these are many letters which should not be counted"""

found_lines = re.findall('.+example.+letters.+file.+', example)

result = {}
for line in found_lines:
    example_word = line.find('example') + len('example')
    file_word = line.find('file', example_word)
    result[line] = file_word - example_word

print result