Python 如何仅打印具有五个或更多正则表达式匹配项的行?
我正在尝试使用Python中的正则表达式逐行解析一个以制表符分隔的大型文本文件,并打印行中包含5个或更多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):
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,
它怎么不起作用?你能修复你的压痕吗?它怎么不工作?你能修好你的压痕吗?