1

我正在尝试在 Python 中使用正则表达式逐行解析一个大的制表符分隔的文本文件,并打印该行包含 5 个或更多实例的行0/1or 1/1

我的脚本几乎就在那里,但我正在努力处理 5 个或更多实例。

这将打印一个匹配的行。

import re  
f = open ("infile.txt", "r")  
out = open("outfile.txt", "w")  

for line in f:  
    if re.match(r"(.*)(0|1)/(1)(.*)", line):  
        print >> out, line,

要仅打印具有 5 个或更多匹配项的行,我尝试findallfinditer以下操作,但它们不起作用:

for line in f:  
    x = len(re.findall(r"(.*)(0|1)/(1)(.*)", line)):  
    if x > 5:  
        print >> out, line,

谁能帮我这个?

这是文本文件中一行的示例(所有空格都是文件中的制表符):

X 6529 . C A,G PASS AC=4,2;AF=0.6777 1/1:0,20 0/1:0,16 0/1:0,16 0/0:4,16 0/0:3,1 
4

2 回答 2

1

您可以使用 {5,} 匹配模式 5 次或更多次

import re
f = open ("data.txt", "r")
out = open("dataout.txt", "w")

for line in f:
    if re.match(r"(.*([01]/1.*){5,}", line):
        print >> out, line,
于 2013-04-06T00:56:42.063 回答
0

我认为有两种可行的解决方案。第一个坚持您当前的想法,即使用与orfindall的一次出现匹配的模式执行 a 。第二个是创建一个模式,该模式将一次匹配该文本五次。0/11/1

对于第一种方法,我认为您需要做的就是摆脱.astericssymbol当前模式的一些部分(我真的不明白为什么要拼写出来,而不是.*,但无论哪种方式都是错误的)。这是应该工作的代码:

for line in f:
    matches = re.findall(r'[01]/1', line)
    if len(matches) >= 5:
        print >> out, line,

我已经消除了不需要的捕获组,它们可能会使事情变慢一些。

对于第二种方法,您只需对 进行一次调用,仅当它找到 5 个适当排序的匹配项时re.search才会返回非值。None该模式使用重复语法 ,{N}来准确地找到N前一个模式的副本。在这种情况下,我们需要匹配0/1or1/1位之间的额外字符,因此该模式.*添加了一个。由于我们想重复整个事情,我们需要将它包装在一个非捕获组中:

for line in f:
    if re.search(r'(:?[01]/1.*){5}', line):
        print >> out, line,
于 2013-04-06T00:57:07.803 回答