2013-04-16 5 views
0

Я передаю сообщение с pre/postamble несколько раз. Я хочу иметь возможность извлечь сообщение между двумя действительными pre/postambles. Мой curent кодPython next substring search

print(msgfile[msgfile.find(preamble) + len(preamble):msgfile.find(postamble, msgfile.find(preamble))]) 

Проблема заключается в том, что если постамбул поврежден, он будет печатать все данные между первой действительной преамбулой и следующим действительным постамбул. Пример получил текстовый файл будет:

garbagePREAMBLEmessagePOSTcMBLEgarbage 
garbagePRdAMBLEmessagePOSTAMBLEgarbage 
garbagePREAMBLEmessagePOSTAMBLEgarbage 

и напечатает

messagePOSTcMBLEgarbage 
garbagePRdEAMBLEmessage 

но то, что я действительно хочу, чтобы напечатать это сообщение от третьей линии, поскольку она имеет как действительный до/иноходь. Поэтому я думаю, что я хочу, чтобы иметь возможность находить и индексировать из следующего экземпляра подстроки. Есть простой способ сделать это?

Редактировать: Я не ожидаю, что мои данные будут в хороших дискретных строках. Я только что отформатированный это таким образом, поэтому было бы легче увидеть

ответ

0

Процесс его построчно:

>>> 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)]) 
0
import re 

lines = ["garbagePREAMBLEmessagePOSTcMBLEgarbage", 
     "garbagePRdAMBLEmessagePOSTAMBLEgarbage", 
     "garbagePREAMBLEmessagePOSTAMBLEgarbage"] 

# you can use regex 
my_regex = re.compile("garbagePREAMBLE(.*?)POSTAMBLEgarbage") 

# get the match found between the preambles and print it 
for line in lines: 
    found = re.match(my_regex,line) 
    # if there is a match print it 
    if found: 
     print(found.group(1)) 

# you can use string slicing 
def validate(pre, post, message): 
    for line in lines: 
     # method would break on a string smaller than both preambles 
     if len(line) < len(pre) + len(post): 
      print("error line is too small") 

     # see if the message fits the pattern 
     if line[:len(pre)] == pre and line[-len(post):] == post: 
      # print message 
      print(line[len(pre):-len(post)]) 

validate("garbagePREAMBLE","POSTAMBLEgarbage", lines) 
0

все сообщения на одной линии? Затем вы можете использовать регулярные выражения для идентификации строк с действительным до и постамбулы:

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 
+0

Это хорошо работает для хороших дискретных линий, но я не ожидал, что данные должны быть отформатированы на всех. Я просто сделал это для удобства просмотра. – tdfoster

+0

У вас есть структура сообщений? максимальная длина, ограниченный набор символов, что-нибудь? –