我有一个针对我的函数的给定输入文件的规则列表。如果在给定的文件中违反了其中任何一个,我希望我的程序返回错误消息并退出。
因此对于诸如以下的行:
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')
答案 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
的内容,所以我做得更友好了。