匹配每一行的元素

时间:2012-04-25 01:49:33

标签: python regex conditional

我有一个针对我的函数的给定输入文件的规则列表。如果在给定的文件中违反了其中任何一个,我希望我的程序返回错误消息并退出。

  • 文件中的每个基因都应该在同一条染色体上

因此对于诸如以下的行:

NM_001003443 chr11 + 5997152 5927598 5921052 5926098 1 5928752,5925972,5927204,5396098, NM_001003444 chr11 + 5925152 5926098 5925152 5926098 2 5925152,5925652,5925404,5926098, NM_001003489 chr11 + 5925145 5926093 5925115 5926045 4 5925151,5925762,5987404,5908098, 等

文件中的每一行都是此行的变体

因此,我想确保文件中的每一行都在chr11

然而,我可能会得到一个文件,其中包含不同的chr列表(以及任意数量的数字)。因此,我想编写一个函数,确保在行中的chr上找到的数字对于每一行都是相同的。

我应该使用正则表达式,或者我该怎么办?顺便说一句,这是在python中。

如:chr \ d +? 我不确定如何确保匹配的内容在每一行都是相同的......

我目前有:

from re import *
for line in file:
    r = 'chr\d+'
    i = search(r, line)
    if i in line:

但我不知道如何确保每一行都相同......

参考sajattack的回答

fp = open(infile, 'r')
for line in fp:
        filestring = ''
        filestring +=line
        chrlist = search('chr\d+', filestring)
        chrlist = chrlist.group()
        for chr in chrlist:
            if chr != chrlist[0]:
                print('Every gene in file not on same chromosome')

3 个答案:

答案 0 :(得分:3)

只需阅读该文件,然后检查每一行,确保其中包含chr11。有字符串函数可以搜索字符串中的子字符串。一旦找到返回false的行(不包含chr11),就会跳出循环并设置标记valid = false

import re

fp = open(infile, 'r')
fp.readline()
tar = re.findall(r'chr\d+', fp.readline())[0]
for line in fp:
    if (line.find(tar) == -1):
        print("Not valid")
        break

这应该在行中搜索一个数字并检查其有效性。

答案 1 :(得分:1)

假设第一个chr是正确的是否安全吗?如果是这样,请使用:

import re
chrlist = re.findall("chr[0-9]+",  open('file').read())
# ^ this is a list with all chr(whatever numbers)
for chr in chrlist:
    if chr != chrlist[0]
        print("Chr does not match")
        break

答案 2 :(得分:0)

我的解决方案使用“匹配组”从“chr”字符串中收集匹配的数字。

import re

pat = re.compile(r'\schr(\d+)\s')

def chr_val(line):
    m = re.search(pat, line)
    if m is not None:
        return m.group(1)
    else:
        return ''

def is_valid(f):
    line = f.readline()
    v = chr_val(line)
    if not v:
        return False

    return all(chr_val(line) == v for line in f)

with open("test.txt", "r") as f:
    print("The file is {0}".format("valid" if is_valid(f) else "NOT valid"))

注意:

  • 预编译正则表达式以获得速度。

  • 使用原始字符串(r'')指定正则表达式。

  • 该模式需要\s字符串两侧的空格(chr)。

  • 如果第一行没有良好的is_valid()值,则
  • False会返回chr。然后它返回一个布尔值,如果以下所有行与第一行的chr值匹配,则该值为true。

  • 您的示例代码只是打印出类似The file is True的内容,所以我做得更友好了。

相关问题