Python 从 .txt 解析字符串

Python string parsing from .txt

我有以下形式的字符串:

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

在 .txt 文件中。我正在尝试使用带有正则表达式的 re.search() 在 python 列表中解析它们,但到目前为止没有成功。你可以猜到列表应该包含如下元素 elements = ["1 HMDB00001", "2 HMDB00002", "3 HMDB00003"]。列表彼此独立。所以,解析的时候可以只考虑一行(eg. }# => 2[1 HMDB00001 ,2 HMDB00002]).

(?<=[\[,])\s*(\d+ HMDB0+\d+)

使用 re.findall instead.See 演示。

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)

这似乎可行,但根据您的问题很难确定。您或许可以根据得到的答案拼凑出一个解决方案。

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']

假设您的模式正好是:一位数、一位数 space、HMDB、5 位数,依此顺序。

结果存储在每行的字典中。

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}'