【问题标题】:Match an element of every line匹配每一行的一个元素
【发布时间】:2012-05-05 16:55:42
【问题描述】:

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

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

因此对于这样的行:

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

【问题讨论】:

  • 你能举一个输入文本的例子(多于一行),什么被认为是“有效的”?如果该行有chr11,那么文件中的每一行也应该在字符串中包含chr11
  • 这听起来像 Python 的 string functionsregex library非常 直接应用。也许有点太简单了,不值得在 SO 上发布问题......
  • 对,很直接。我只是不断遇到错误,我是编程新手,需要一些帮助。
  • 你试过什么?如果您无法让一些代码正常工作,您应该展示您遇到问题的代码,并描述哪些代码不能正常工作或不符合您的预期。
  • 我添加了上面的内容,但不确定该去哪里...抱歉这个菜鸟问题。我真的需要一些帮助

标签: python regex conditional


【解决方案1】:

只需读取文件并使用 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

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

【讨论】:

  • 对,但我需要将数字设为可变,以防我要查找的不是 chr11,而是不同的 chr。他们只需要相同的字符(然后是数字)
  • 事情就是这样。有了给我的文件。我不想输入一个数字来查看该染色体是否在那里。我只想确保无论一行中的 chr 上的数字是什么,它在文件中的每一行都是相同的。但我不能在函数中输入数字...
  • 所以你有 10 行。所有 10 行都有chr11,这是有效的吗?现在如果第 5 行有 chr12 那是无效的?而且您只想将文件路径作为唯一参数提供给它。
  • 正确。我很确定我想开始我的功能:for line in file:
  • 更新后的函数使用第一行作为参考。因此,如果第一行有chr15,那么这就是每个后续行都与之比较的数字。如果任何一行没有chr15,那么它会立即跳出循环并返回false。
【解决方案2】:

假设第一个 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

【讨论】:

  • 好吧,这可能行得通,因为第一个或第 22 个是否正确可能无关紧要,只要所有其他都等于那个,就可以了,对吧?
  • 这实际上可能不起作用,因为如果该元素不等于列表中的每个元素(任何可能的数字,这是一个很难制作的列表),这实际上可能不起作用不匹配,对吗?
  • 它正在列出我们正在检查的字符串中的所有 chr(无论数字)。所以我们可以说,我们正在检查“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 CHR 10 + 5925146 5926095 5925152 5926045 5925151 4, 5925762, 5987404,5908098, chr11 + 5925145 5926093 5925115 5926045 4 5925151,5925762, 5987404,5908098, 列表将是 ['chr11', 'chr11', 'chr11', ''chrpan'>
  • 哦!好的,那么我相信这确实有效!我误解了它,认为您正在尝试列出每个可能的数字。感谢您向我解释
  • 所以如果我将'for line in file:'放在'chrlist ='上方并将'a string in your file'更改为'line',这应该可以正常工作吗?
【解决方案3】:

我的解决方案使用“匹配组”从“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'') 指定正则表达式。

  • 该模式要求在chr 字符串的任一侧都有空格(\s)。

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

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

【讨论】:

  • 这看起来似乎有效。然而,由于我只是想把它变成一个更大功能的一小部分,所以我不想做多个功能。我不确定如何在不调用其他函数的情况下将其合并到一个函数中,这对于我正在寻找的东西可能有点复杂,尽管我确信它可以工作。它可能无法像在另一个函数中那样使用。
  • 我真的不知道你在这里问我什么。为什么这段代码很难从另一个函数调用?
  • 嗯,你不能在一个函数中定义一个函数,对吧?我知道你可以调用一个,但我不知道在基函数内部调用的那些函数中输入什么
  • 首先,在Python中,你可以在一个函数中定义一个函数。其次,您可以将这些函数定义放在源代码中的函数上方,它们将被定义并可供您的函数使用。
  • 哦,我不知道你可以在一个函数中定义一个函数,这很酷。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2020-02-07
相关资源
最近更新 更多