2015-01-19 4 views
1

Я пытаюсь извлечь строки в Python, полученные функцией.Извлечение переменной из вызова функции в Python

Учитывайте следующее:

У меня есть скрипт, который работает на Python. Скрипт работает постоянно. Он привязывается к порту USB и прослушивает входящие кадры данных ZigBee.

У меня есть функция, которая рассеивает этот информационный кадр;

# Decoded data frame to use later on 
def decodeReceivedFrame(data): 
      source_addr_long = toHex(data['source_addr_long']) 
      source_addr = toHex(data['source_addr']) 
      id = data['id'] 
      rf_data = data['rf_data'] 
      #samples = data['samples'] 
      return [source_addr_long, source_addr, id, rf_data] 

Когда я печатаю эту функцию позже; он дает мне правильные входящие значения. Например;

decodedData = decodeReceivedFrame(data) 
print decodedData 

Выход:

[None, None, 'rx', '<=>\x80\x02#387239766#XBEE#126#STR:wm2 #STR:c47cb3f57365#'] 

То, что я хочу сделать, это извлечь два STR переменные этой строки. Это означает строку wm2 и строку c47cb3f57365 в двух отдельных переменных.

Какая функция на Python была бы наиболее эффективной для решения этой проблемы?

+0

это всегда в том же формате? –

+0

К сожалению, нет. Две записи STR могут быть разными по желанию. Однако формат отображения будет таким же. – MichaelP

+0

всегда ли цифры и буквы? –

ответ

3

предполагающие данные всегда в формате, как описано в комментариях, это будет один из самых эффективных способов:

s = '<=>\x80\x02#387239766#XBEE#126#STR:wm2 #STR:c47cb3f57365#' 
# rsplit with 2 as the second arg will split twice on #STR starting from the send of s 
spl = s.rsplit("#STR:",2) 
# get last two elements from spl 
a,b = spl[1],spl[2][:-1] # ,[:-1] removes the final # 
print a,b 
wm2 c47cb3f57365 

Некоторых тайминги, используя IPython и timeit:

In [6]: timeit re.findall(r'STR:(\w+)', s) 
1000000 loops, best of 3: 1.67 µs per loop 

In [7]: %%timeit 
spl = s.rsplit("#STR:",2) 
a,b = spl[1],spl[2][:-1] 
    ...: 
1000000 loops, best of 3: 409 ns per loop 

Если вы должны были использовать регулярное выражение, которое вы должны скомпилировать:

patt = re.compile(r'STR:(\w+)') 
patt.findall(s) 

Что повышает эффективность :

In [6]: timeit patt.findall(s) 
1000000 loops, best of 3: 945 ns per loop 
+0

Кажется, что грязно просто сбрасывает содержимое вашего интерактивного сеанса практически без комментариев. Какой из них был лучше? Похоже, что 's.rsplit (« # STR2 », 2)« для меня заняло меньше 1/4-го, но на самом деле вы этого не делаете. – ArtOfWarfare

+0

@ArtOfWarfare, тайминги буквально там, чтобы видеть, как он может быть более прозрачным? –

+0

Что такое тарабарщина на строках с 2 по 5 вашего ответа? Почему у вас есть подсказки IPython, смешанные с вашим ответом? Почему 'timeit' смешивается с кодом, выполняющим фактическую работу? Вы уже сделали 6 изменений в этом сообщении - мне кажется, вы должны знать, что это может быть лучше. Сколько было ускорение, когда вы начали компилировать регулярное выражение? – ArtOfWarfare

1
>>> import re  
>>> re.findall(r'STR:(\w+)', '<=>\x80\x02#387239766#XBEE#126#STR:wm2 #STR:c47cb3f57365#') 
['wm2', 'c47cb3f57365'] 
Смежные вопросы