2015-03-05 2 views
0

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

}# => 2[1 HMDB00001 ,2 HMDB00002] 
}# => 5[1 HMDB00001 ,2 HMDB00002, 3 HMDB00003 ,4 HMDB00004,5 HMDB00005] 
}# => 1[1 HMDB00001] 

в текстовом файле. Я пытаюсь разобрать их в списках python, используя re.search() с регулярными выражениями, но пока что неудачно. Поскольку вы можете угадать, список должен содержать элементы следующим образом: elements = ["1 HMDB00001", "2 HMDB00002", "3 HMDB00003"]. Списки независимы друг от друга. Таким образом, при анализе только одной строки можно принять во внимание (eg. }# => 2[1 HMDB00001 ,2 HMDB00002]).

+7

Сделайте свои * неудачные попытки * –

ответ

0

Это похоже на работу, но его трудно точно сказать, учитывая ваш вопрос. Вы можете собрать вместе решение из ответов.

import re 

strings = [ 
    '}# => 2[1 HMDB00001 ,2 HMDB00002]', 
    '}# => 5[1 HMDB00001 ,2 HMDB00002, 3 HMDB00003 ,4 HMDB00004,5 HMDB00005]', 
    '}# => 1[1 HMDB00001]', 
] 

for s in strings: 
    mat = re.search(r'\[(.*)\]', s) 
    elements = map(str.strip, mat.group(1).split(',')) 
    print elements 

Какие выходы:

['1 HMDB00001', '2 HMDB00002'] 
['1 HMDB00001', '2 HMDB00002', '3 HMDB00003', '4 HMDB00004', '5 HMDB00005'] 
['1 HMDB00001'] 
2
(?<=[\[,])\s*(\d+ HMDB0+\d+) 

Используйте вместо этого re.findall.See demo.

https://regex101.com/r/eS7gD7/19#python

import re 
p = re.compile(r'(?<=[\[,])\s*(\d+ HMDB0+\d+)', re.IGNORECASE | re.MULTILINE) 
test_str = "}# => 2[1 HMDB00001 ,2 HMDB00002]\n}# => 5[1 HMDB00001 ,2 HMDB00002, 3 HMDB00003 ,4 HMDB00004,5 HMDB00005]\n}# => 1[1 HMDB00001]" 

re.findall(p, test_str) 
0

Предположим, что ваш шаблон именно: одна цифра, один пробел, HMDB, 5 цифр, в этом порядке.

Результаты хранятся в файле dict для каждой строки.

import re 

matches = {} 
with open('my_text_file.txt', 'r') as f: 
    for num, line in enumerate(f): 
     matches.update({num: re.findall(r'\d\sHMDB\d{5}', line)}) 

print(matches) 

Если HMDB может отличаться, вы можете использовать r'\d\s[a-zA-Z]{4}\d{5}'.