\r
不是有效的字符类,我认为您打算\s
改用它。如果您也不使用它们,您可以减少这些组。
但最重要的是,您需要正确提取组:
match = re.search(r'>(\w+)\s+(\w+)', line)
if match:
tag, gene = match.groups()
myDict[tag] = gene
通过只创建两个捕获组,我们可以更简单地提取这两个.groups()
并直接将它们分配给两个变量,tag
和gene
。
然而,阅读FASTA 格式似乎表明这是一种多行格式,标签在一行,基因数据在多行之后。在那种情况下,你\r
的意思是匹配换行符。当您一次读取一行文件时,这将不起作用。
如果没有像这样的正则表达式,读取该格式会简单得多:
myDict = {}
with open('d.fasta', 'rU') as fileData:
tag = None
for line in fileData:
line = line.strip()
if not line:
continue
if line[0] == '>':
tag = line[1:]
myDict[tag] = ''
else:
assert tag is not None, 'Invalid format, found gene without tag'
myDict[tag] += line
print myDict
这将逐行读取文件,根据起始>
字符检测标签,然后读取多行基因信息,将其收集到最近读取的标签下的字典中。
注意rU
模式;我们使用 python 的通用换行模式打开文件,以处理用于创建文件的任何换行约定。
最后但并非最不重要的; 看看BioPy 项目;他们的Bio.SeqIO
模块可以完美地处理 FASTA 以及许多其他格式。