2016-08-24 7 views
0

У меня есть строка вывод, которая выглядит следующим образом:Извлечение части строки в Python с ограничениями

Distance AAAB: ,0.13634,0.13700,0.00080,0.00080,-0.00066,.00001, 
Distance AAAC: ,0.12617,0.12680,0.00080,0.00080,-0.00063,, 
Distance AAAD: ,0.17045,0.16990,0.00080,0.00080,0.00055,, 
Distance AAAE: ,0.09330,0.09320,0.00080,0.00080,0.00010,, 
Distance AAAF: ,0.21048,0.21100,0.00080,0.00080,-0.00052,, 
Distance AAAG: ,0.02518,0.02540,0.00040,0.00040,-0.00022,, 
Distance AAAH: ,0.11404,0.11450,0.00120,0.00110,-0.00046,, 
Distance AAAI: ,0.10811,0.10860,0.00080,0.00070,-0.00049,, 
Distance AAAJ: ,0.02430,0.02400,0.00200,0.00200,0.00030,, 
Distance AAAK: ,0.09449,0.09400,0.00200,0.00100,0.00049,, 
Distance AAAL: ,0.07689,0.07660,0.00050,0.00050,0.00029, 

То, что я хочу сделать, это извлечь определенный набор данных из этого блока, например, только Расстояние AAAH так:

Distance AAAH: ,0.11404,0.11450,0.00120,0.00110,-0.00046,, 

измерения всегда начинается с Расстояние AAA *: с звездой является единственным персонажем, который будет меняться.

Осложнения: Это должно быть общим, потому что у меня много разных наборов данных, и поэтому расстояние AAAH может не всегда сопровождаться расстоянием AAAI или предшествующим расстоянием AAAG, поскольку измерения для разных предметов различаются. Я также не могу полагаться на .len(), потому что последнее измерение иногда может быть пустым (так же, как и с расстоянием AAAH) или может быть заполнено (как с расстоянием AAAB. И я не думаю, что могу использовать .find (), потому что мне нужно все номера следующих Distance ааа.

Я все еще очень новое, и я старался изо всех сил, чтобы найти решение, похожее на эту проблему, но не везло.

+1

могли бы вы предоставить еще несколько примеров типа запроса вы будете делать? Например, вы всегда будете предоставлять полную последовательность букв? Будете ли вы использовать дикие карты, такие как A * L? –

ответ

1

Вы можете искать текст этого сценария:

#fullText = YOUR STRING 
text = fullText.splitlines() 
for line in text: 
    if line.startswith('Distance AAAH:'): 
     print line 

Выход: Distance AAAH: ,0.11404,0.11450,0.00120,0.00110,-0.00046,,

+1

Это действительно ужасное условие, если вы не можете четко указать, что данные на линии не будут содержать 'AAAH'. 'if line.startswith ('Расстояние AAAH:'):' было бы намного безопаснее и четко указывало бы ваше намерение. – ShadowRanger

+3

Вместо 'split ('\ n')', вы можете использовать 'splitlines()'. Кроме того, 'str' - это страшное имя переменной, так как это тень типа. –

+0

@tobias_k thanks :) отредактировал –

1

Вы можете использовать . re модуль и делает функция должна быть удобной

import re 
def SearchDistance(pattern,text): 
    pattern = pattern.replace(' ','\s') 
    print re.findall(r'{0}.+'.format(pattern),a) 

SearchDistance('Distance AAAH',a) 

Выход:.

['Distance AAAH: ,0.11404,0.11450,0.00120,0.00110,-0.00046,,'] 
+0

Возможно, вы захотите использовать ['re.escape'] (https://docs.python.org/3/library/re.html#re.escape) в получаемом вами шаблоне, если только вы не собираетесь разрешать регулярное выражение специальные предложения, которые будут переданы и использованы абонентом. Очевидно, что это не проблема, если шаблоны никогда не содержат специальных символов регулярных выражений, но это плохое предположение делать большую часть времени. – ShadowRanger

Смежные вопросы