Python下一个子串搜索

Python下一个子串搜索,python,string,search,substring,Python,String,Search,Substring,我正在多次发送带有前置/后置码的消息。我希望能够在两个有效的前置/后置码之间提取消息。我现在的代码是 print(msgfile[msgfile.find(preamble) + len(preamble):msgfile.find(postamble, msgfile.find(preamble))]) 问题是,如果后同步码损坏,它将打印第一个有效前同步码和下一个有效后同步码之间的所有数据。收到的文本文件示例如下: garbagePREAMBLEmessagePOSTcMBLEgarbage

我正在多次发送带有前置/后置码的消息。我希望能够在两个有效的前置/后置码之间提取消息。我现在的代码是

print(msgfile[msgfile.find(preamble) + len(preamble):msgfile.find(postamble, msgfile.find(preamble))])
问题是,如果后同步码损坏,它将打印第一个有效前同步码和下一个有效后同步码之间的所有数据。收到的文本文件示例如下:

garbagePREAMBLEmessagePOSTcMBLEgarbage
garbagePRdAMBLEmessagePOSTAMBLEgarbage
garbagePREAMBLEmessagePOSTAMBLEgarbage
它会打印出来

messagePOSTcMBLEgarbage
garbagePRdEAMBLEmessage
但我真正希望它打印的是第三行的消息,因为它同时具有有效的pre/post amble。所以我想我想要的是能够从子字符串的下一个实例中查找和索引。有没有一个简单的方法可以做到这一点


编辑:我不希望我的数据是在很好的离散线。我只是以这种方式格式化了它,以便更容易看到逐行处理它:

>>> test = "garbagePREAMBLEmessagePOSTcMBLEgarbage\n"
>>> test += "garbagePRdAMBLEmessagePOSTAMBLEgarbage\n"
>>> test += "garbagePREAMBLEmessagePOSTAMBLEgarbage\n"
>>> for line in test.splitlines():
        if line.find(preamble) != -1 and line.find(postamble) != -1:
            print(line[line.find(preamble) + len(preamble):line.find(postamble)])
重新导入
lines=[“GarbageStreamMessagePostmbleGarbage”,
“垃圾邮件垃圾”,
“垃圾邮件垃圾”]
#你可以使用正则表达式
my_regex=re.compile(“垃圾可回收(.*)后垃圾”)
#获取序言之间的匹配项并打印它
对于行中的行:
发现=重新匹配(我的正则表达式,行)
#如果有匹配项,请打印它
如果发现:
打印(已找到。组(1))
#可以使用字符串切片
def验证(前、后、消息):
对于行中的行:
#方法将在小于两个前导码的字符串上中断
如果长度(线)<长度(前)+长度(后):
打印(“错误行太小”)
#查看消息是否符合模式
如果行[:len(pre)]==pre和行[-len(post):]==post:
#打印消息
打印(行[len(前):-len(后)])
验证(“垃圾可回收”,“垃圾后回收”,行)

所有消息都在一行上吗? 然后,您可以使用正则表达式来标识具有有效前置码和后置码的行:

input_file = open(yourfilename)
import re
pat = re.compile('PREAMBLE(.+)POSTAMBLE')
messages = [pat.search(line).group(1) for line in input_file 
            if pat.search(line)]

print messages

这适用于漂亮的离散行,但我不希望数据被格式化。我这样做只是为了便于查看。你对这些信息有什么结构吗?最大长度,限制字符集,什么?
input_file = open(yourfilename)
import re
pat = re.compile('PREAMBLE(.+)POSTAMBLE')
messages = [pat.search(line).group(1) for line in input_file 
            if pat.search(line)]

print messages