使用Python运行嵌套字符串搜索

使用Python运行嵌套字符串搜索,python,string,Python,String,我想知道是否有一种简单的方法可以在一个巨大的文本文件中运行嵌套搜索字符串 我有一个文本文件,它可以包含一行文本来突出显示特定的问题区域。我正在研究可能的嵌套搜索,但也避免在整个文本文件上运行一个完整的新搜索来查找关联的第二个字符串,而是从第一个字符串匹配点开始继续 例如,如果在文本文件上运行字符串搜索,我发现一个“问题字符串”,我希望然后运行二次搜索,或者最好是继续搜索(从问题行),以找到第二个搜索字符串的第一个匹配项。在我的例子中,第二个搜索字符串是查找最近的“GPS信息”字符串,然后从文本文

我想知道是否有一种简单的方法可以在一个巨大的文本文件中运行嵌套搜索字符串

我有一个文本文件,它可以包含一行文本来突出显示特定的问题区域。我正在研究可能的嵌套搜索,但也避免在整个文本文件上运行一个完整的新搜索来查找关联的第二个字符串,而是从第一个字符串匹配点开始继续

例如,如果在文本文件上运行字符串搜索,我发现一个“问题字符串”,我希望然后运行二次搜索,或者最好是继续搜索(从问题行),以找到第二个搜索字符串的第一个匹配项。在我的例子中,第二个搜索字符串是查找最近的“GPS信息”字符串,然后从文本文件中收集GPS信息(即,第一个“问题字符串”的下一个连续GPS字符串)

我希望这有道理?!?基本上,我希望避免对文本文件进行全新的搜索,而是从找到第一个字符串的位置继续搜索

下面我有一些代码,但这只是找到第一个字符串,如果我要查找第二个字符串,我通常会开始新的搜索,但这并不保证我找到下一个连续的字符串

f = open(file, "r")    
searchlines = f.readlines()
searchstringsProblem = ['BIG Problem Line']
searchstringsGPSLoc = ['GPS INFO']

a = 0
tot = 0
row_num=0 # let it be current row number

while a<len(searchstringsProblem):
    for i, line in enumerate(searchlines):
        for word in searchstringsProblem:
            if word in line:
                prob = line.split()
                worksheet.write(2,0,"Problem ID:", bold) 
                worksheet.write(2,1,prob[5]) 
                break
    a = a+1
谢谢你的关注


MikG

您可以通过逐行迭代文件来跟踪这些行,而不是将它们全部放在带有.readlines()的列表中。类似以下内容可能适合您的需要(它将查找所有问题/gps对,请注意,如果没有以下gps对,它将不会查找问题):

文件:

代码:

这就产生了我们:

[('BIG Problem Line', 'blah GPS INFO: 238490'), ('BIG Problem Line2', 'GPS INFO: 12343')]
如果要跟踪行号,可以使用enumerate遍历行,然后将其添加到附加值中。不确定你想如何存储所有的匹配,所以我只是假设了一个列表[(问题,gps)]的情况


编辑:更新了每个注释支持的经度/纬度:

文件:

代码:

输出:

('BIG Problem Line', 'blah GPS INFO: 238490', 'LONGITUDE: 456', 'LATITUDE: 654')
('BIG Problem Line2', 'GPS INFO: 12343', 'LONGITUDE: 432', 'LATITUDE: 678')
('BIG Problem Line', 'Key line2 GPS Info', '+51.47700', '-0.00000')

EDIT2:更新为在查找经度/纬度时忽略空行:

文件:

代码:

输出:

('BIG Problem Line', 'blah GPS INFO: 238490', 'LONGITUDE: 456', 'LATITUDE: 654')
('BIG Problem Line2', 'GPS INFO: 12343', 'LONGITUDE: 432', 'LATITUDE: 678')
('BIG Problem Line', 'Key line2 GPS Info', '+51.47700', '-0.00000')

编辑:添加了获取经度和纬度的支持。 EDIT2:正确拆分

如果您想记录问题编号(即问题第一次出现、第二次出现等),您可以添加一些枚举或计数器,或者在当前
中添加
else
,如果
在发现
大问题行时写入一些文本

def get_text_file(path):
    with open(path, "r") as f:
        searchstrings = ['BIG Problem Line', 'GPS INFO']
        current_string = 0
        for line in f:
            if searchstrings[current_string] in line:
                # That is, if the current index is 1 (you're looking for GPS info)
                if(current_string):
                    long_line = f.next()
                    lat_line = f.next()
                    long_value = long_line.split('=')[1]
                    lat_value = lat_line.split('=')[1]
                    some_write_function(long_value, lat_value) 
                current_string ^= 1 # Flips the bit (0^(1)=1, 1^(1)=0)

您是只查找一个匹配项还是多个匹配项?也就是说,如果你发现一个问题/GPS匹配,那么你就完成了,或者你想要所有的配对。嗨,鲍勃,现在只是第一个匹配,但我想将来我可能会想找到多个匹配(如果日志文件中有几个问题区域),这样我就可以在地图上绘制一系列GPS坐标。@MikG查看我的答案,我添加了对查找经纬线的支持。谢谢Bob,我刚刚试用过,效果很好!还有一个问题,在我前面的例子中,我列举了搜索行,这样我就可以跳下几行来收集更多的信息。在我的文本文件中,我有一个“GPS信息”行,下面一行给出“经度”,然后下一行给出“纬度”,我通常会在每一行上进行拆分,以提取两个GPS点,在您的示例中,这是否可能下拉一行或两行?我想现在,与其搜索“GPS信息”,我至少可以先搜索“经度”,你能再详细说明一下吗?不确定你在这里想要达到什么。您可以使用
f.next()
转到下一行,这将再次跳转该行并返回下一行的字符串。因此,如果您还在查找GPS信息后的下两行,您可以在elif循环中使用
f.next()
,然后进行拆分。不确定你想获取什么信息。也许一个简短的示例文件会有所帮助。嗨,鲍勃,我已经添加了一个GPS信息的示例,下面是我想要抓取的行。我已经尝试了你的更新,这看起来很有效,只是我现在需要跳过空行。添加了另一个更新,应该适合基于提供的文件的场景。太棒了!谢谢你,鲍勃,这个很好用。为我所有的无厘头的问题道歉,最近我从Perl迁移到Python,我还在学习。你的例子会让我忙上一段时间。再次感谢!谢谢艾尔·萨尔。我可以看到您的示例部分用于我的文本文件,我对此进行了进一步的研究让我知道您的文本文件是否存在任何问题。嗨,Al.Sal,它正在发现“大问题行”,但是,当它继续在文本文件中进一步搜索GPS信息行时,它似乎停留在“大问题行”上,然后从那里分离,在if(当前_字符串):行出现问题。因此,如果发现“大问题线路”,我需要继续搜索下一条“GPS信息”线路,然后开始从这个新点抓取和拆分线路真的吗?真奇怪。它在一个格式相同的文件上运行良好。
('BIG Problem Line', 'blah GPS INFO: 238490', 'LONGITUDE: 456', 'LATITUDE: 654')
('BIG Problem Line2', 'GPS INFO: 12343', 'LONGITUDE: 432', 'LATITUDE: 678')
BIG Problem Line

Key line2 GPS Info

GPS = Active

Longitude = -0.00000

Latitude = +51.47700
searchstringsProblem = 'BIG Problem Line'
searchstringsGPSLoc = 'GPS Info'
matches = []

with open("test.txt") as f:
    problem = False
    problem_line = ""

    for line in f:
        if not problem and searchstringsProblem in line:
            problem_line = line.strip()
            problem = True
        elif problem and searchstringsGPSLoc in line:
            latitude = ""
            longitude = ""
            for new_line in f:
                if "Longitude" in new_line:
                    longitude = new_line.split("=")[1].strip()
                elif "Latitude" in new_line:
                    latitude = new_line.split("=")[1].strip()
                if longitude and latitude:
                    break;

            if latitude and longitude:
                matches.append((problem_line, line.strip(), latitude, longitude))
                problem = False

for item in matches:
    print item
('BIG Problem Line', 'Key line2 GPS Info', '+51.47700', '-0.00000')
def get_text_file(path):
    with open(path, "r") as f:
        searchstrings = ['BIG Problem Line', 'GPS INFO']
        current_string = 0
        for line in f:
            if searchstrings[current_string] in line:
                # That is, if the current index is 1 (you're looking for GPS info)
                if(current_string):
                    long_line = f.next()
                    lat_line = f.next()
                    long_value = long_line.split('=')[1]
                    lat_value = lat_line.split('=')[1]
                    some_write_function(long_value, lat_value) 
                current_string ^= 1 # Flips the bit (0^(1)=1, 1^(1)=0)