Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何仅打印具有五个或更多正则表达式匹配项的行?_Python_Regex_Python 2.x_Multiple Instances - Fatal编程技术网

Python 如何仅打印具有五个或更多正则表达式匹配项的行?

Python 如何仅打印具有五个或更多正则表达式匹配项的行?,python,regex,python-2.x,multiple-instances,Python,Regex,Python 2.x,Multiple Instances,我正在尝试使用Python中的正则表达式逐行解析一个以制表符分隔的大型文本文件,并打印行中包含5个或更多0/1或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):

我正在尝试使用Python中的正则表达式逐行解析一个以制表符分隔的大型文本文件,并打印行中包含5个或更多
0/1
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个或更多匹配项的行,我尝试了
findall
finditer
,如下所示,但均无效:

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

以下是文本文件中一行的示例(文件中的所有空格都是选项卡):


您可以使用{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,

您可以使用{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,

我认为有两种解决办法可以奏效。第一种方法坚持您当前的想法,即使用与
0/1
1/1
中的一种匹配的模式执行
findall
。第二种方法是制作一个模式,一次匹配该文本五次

对于第一种方法,我认为您需要做的就是去掉当前模式中的
.astericssmbol
位(我真的不明白为什么会这样,而不是
*
,但这两种方式都是错误的)。下面是应该可以工作的代码:

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/1
1/1
位之间的额外字符,因此模式添加了
*
。因为我们想重复整个过程,所以需要将其包装在一个非捕获组中:

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

我认为有两种解决办法可以奏效。第一种方法坚持您当前的想法,即使用与
0/1
1/1
中的一种匹配的模式执行
findall
。第二种方法是制作一个模式,一次匹配该文本五次

对于第一种方法,我认为您需要做的就是去掉当前模式中的
.astericssmbol
位(我真的不明白为什么会这样,而不是
*
,但这两种方式都是错误的)。下面是应该可以工作的代码:

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/1
1/1
位之间的额外字符,因此模式添加了
*
。因为我们想重复整个过程,所以需要将其包装在一个非捕获组中:

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

它怎么不起作用?你能修复你的压痕吗?它怎么不工作?你能修好你的压痕吗?