0

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

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

因此对于诸如以下的行:

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:

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

关于 sajatack 的回答

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')
4

3 回答 3

3

只需阅读文件并使用 while 循环检查每一行以确保它包含chr11. 有字符串函数可以搜索字符串中的子字符串。一旦找到返回 false (不包含chr11)的行,就跳出循环并设置一个 flag 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

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

于 2012-04-25T02:05:15.393 回答
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
于 2012-04-25T02:35:30.227 回答
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第一行的值匹配,则返回一个布尔值。

  • 你的示例代码只是打印了一些类似的东西,The file is True所以我让它更友好一些。

于 2012-04-25T03:28:26.943 回答