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, etc.

ファイル内の各行は、この行のバリエーションになります

したがって、ファイル内のすべての行が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) 行を見つけるとすぐに、ループから抜け出し、フラグを設定します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次に、後続のすべての行が最初の行の値と一致する場合に true であるブール値を返します。

  • サンプルコードは次のようなものを出力するだけなThe file is Trueので、少し使いやすくしました。

于 2012-04-25T03:28:26.943 に答える