从.tx解析Python字符串

2024-04-25 12:17:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下形式的字符串:

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

在.txt文件中。我尝试使用检索()使用正则表达式,但至今未成功。正如你所猜测的,这个列表应该包含如下元素elements = ["1 HMDB00001", "2 HMDB00002", "3 HMDB00003"]。列表是相互独立的。因此,在解析时只能考虑一行(eg. }# => 2[1 HMDB00001 ,2 HMDB00002])。你知道吗


Tags: 文件字符串txt元素列表elements形式eg
3条回答
(?<=[\[,])\s*(\d+ HMDB0+\d+)

使用re.findall相反,看到了吗演示。你知道吗

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)

假设您的模式正好是:一个数字,一个空格,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}'。你知道吗

这似乎有效,但鉴于你的问题很难确定。你也许能从你得到的答案中拼凑出一个解决方案。你知道吗

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

相关问题 更多 >