【问题标题】:How can I print only the lines with five or more matches of a regular expression?如何仅打印具有五个或更多匹配正则表达式的行?
【发布时间】:2013-04-06 00:33:26
【问题描述】:

我正在尝试在 Python 中使用正则表达式逐行解析一个大的制表符分隔的文本文件,并打印该行包含 5 个或更多 0/11/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 

【问题讨论】:

  • 怎么不行?你能修复你的缩进吗?

标签: python regex python-2.x multiple-instances


【解决方案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,

【讨论】:

    【解决方案2】:

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

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

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

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

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

    for line in f:
        if re.search(r'(:?[01]/1.*){5}', line):
            print >> out, line,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2022-11-02
      • 2015-02-24
      • 2021-12-06
      相关资源
      最近更新 更多