Python中的正则表达式跳过了行的前两个字符

3
我有一个文本文件,内容如下:

Name     #Variants  #Cases  #Controls

CNGA3   5   5   0
GPR125  4   3   0
IGHMBP2 4   4   0
STK11IP 4   4   0
ACAD9   3   3   0
ANKRD17 3   3   0

我希望能够解析这个文件并将所有基因名(name列)返回到一个列表中 - list_of_genes,或者类似的东西。
我有以下代码。
gene_list = []
for i in range (6, 7):
    run_file = open('run_{}_results.txt'.format(i))
    gene = re.compile('[^\s]*', re.I)
    for line in run_file:
        match=gene.match(line, re.IGNORECASE)
        if match:
            matched_gene = match.group()
            gene_list.append(matched_gene)

当我运行那段代码时,得到的结果是:
['GA3', 'R125', 'HMBP2', 'K11IP', 'AD9', 'KRD17']

正则表达式跳过了每个基因的前两个字符,我无法弄清原因。

3
欢迎来到stackoverflow。你的编码风格与他人无关,但如果你花点功夫将问题代码单独分离出来并组成一个更简单的问题,就能得到更好的回答。这里所有那些 ij 循环都是无关紧要的。 - alexis
2
顺便提一下,在Python中,你几乎从不使用或需要索引变量来迭代某些东西。相反,你直接在列表、字典或任何集合数据类型上进行迭代。不需要ij等。 - Tim Pietzcker
@alexis会做的,谢谢你的提示! - peterat33rpm
@TimPietzcker,那是因为我不想让它查看文件中的第一行,而且我不知道其他跳过它的方法。 - peterat33rpm
只需执行 next(runfile)runfile.readline() 即可跳过一行。 - Tim Pietzcker
1个回答

7

你的问题在这里:

match=gene.match(line, re.IGNORECASE)
正则表达式对象的match()方法的第二个参数是pos,表示匹配操作的起始位置。re.IGNORECASE恰好是2。
您已经在编译时定义了大小写不敏感的正则表达式,因此当然没有必要再次这样做(因此也没有办法)。此外,您的正则表达式不需要该选项,因为它不包含任何大、小写字母。
另外,“[^\s]*”应该改为“r"\S*"”。

@Petera,既然这个回答解决了你的问题,你现在应该点击旁边的大勾选标记“接受”这个答案。 - alexis
@alexis 我懂了,本来想这么做的,只是忘记了。再次感谢! - peterat33rpm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接