Python读取文件直到匹配,读取直到下一个模式

Python读取文件直到匹配,读取直到下一个模式,python,regex,pattern-matching,Python,Regex,Pattern Matching,Python 2.4.3 我需要通读一些文件(可以大到10GB)。我需要它做的是遍历文件,直到它匹配一个模式。然后打印该行和其后的每一行,直到它与另一个图案匹配。此时,继续读取文件,直到下一个模式匹配为止 比如说。文件包含 ---- Alpha ---- Zeta ...(text lines) ---- Bravo ---- Delta ...(text lines) 等等 如果在----阿尔法----泽塔上匹配,它应该打印----阿尔法----泽塔和之后的每一行,直到它遇到----布拉沃

Python 2.4.3

我需要通读一些文件(可以大到10GB)。我需要它做的是遍历文件,直到它匹配一个模式。然后打印该行和其后的每一行,直到它与另一个图案匹配。此时,继续读取文件,直到下一个模式匹配为止

比如说。文件包含

---- Alpha ---- Zeta
...(text lines)

---- Bravo ---- Delta
...(text lines)
等等

如果在----阿尔法----泽塔上匹配,它应该打印----阿尔法----泽塔和之后的每一行,直到它遇到----布拉沃----德尔塔(或除----阿尔法----泽塔以外的任何东西),它会一直读下去,直到它再次匹配----阿尔法----泽塔

下面的内容与我要查找的内容匹配,但只打印匹配的行,而不是它后面的文本

你知道我哪里出了问题吗

import re
fh = open('text.txt', 'r')

re1='(-)'   # Any Single Character 1
re2='(-)'   # Any Single Character 2
re3='(-)'   # Any Single Character 3
re4='(-)'   # Any Single Character 4
re5='( )'   # White Space 1
re6='(Alpha)'  # Word 1
re6a='((?:[a-z][a-z]+))'   # Word 1 alternate
re7='( )'   # White Space 2
re8='(-)'   # Any Single Character 5
re9='(-)'   # Any Single Character 6
re10='(-)'  # Any Single Character 7
re11='(-)'  # Any Single Character 8
re12='(\\s+)'  # White Space 3
re13='(Zeta)'  # Word 2
re13a='((?:[a-z][a-z]+))'  # Word 2 alternate


rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10+re11+re12+re13,re.IGNORECASE|re.DOTALL)
rga =     re.compile(re1+re2+re3+re4+re5+re6a+re7+re8+re9+re10+re11+re12+re13a,re.IGNORECASE|re.DOTALL)


for line in fh:
    if re.match(rg, line):
        print line
        fh.next()
        while not re.match(rga, line):
            print fh.next()

fh.close()
还有我的示例文本文件

---- Pappa ---- Oscar
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris eleifend imperdiet 
lacus quis imperdiet. Nulla erat neque, laoreet vel fermentum a, dapibus in sem. 
Maecenas elementum nisi nec neque pellentesque ac rutrum urna cursus. Nam non purus 
sit amet dolor fringilla venenatis. Integer augue neque, scelerisque ac dictum at, 
venenatis elementum libero. Etiam nec ante in augue porttitor laoreet. Aenean ultrices
pellentesque erat, id porta nulla vehicula id. Cras eu ante nec diam dapibus hendrerit
in ac diam. Vivamus velit erat, tincidunt id tempus vitae, tempor vel leo. Donec 
aliquam nibh mi, non dignissim justo.

---- Alpha ---- Zeta
Sed molestie tincidunt euismod. Morbi ultrices diam a nibh varius congue. Nulla velit
erat, luctus ac ornare vitae, pharetra quis felis. Sed diam orci, accumsan eget 
commodo eu, posuere sed mi. Phasellus non leo erat. Mauris turpis ipsum, mollis sed 
ismod nec, aliquam non quam. Vestibulum sem eros, euismod ut pharetra sit amet, 
dignissim eget leo.

---- Charley ---- Oscar
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. 
Aliquam commodo, metus at vulputate hendrerit, dui justo tempor dui, at posuere    
ante vitae lorem. Fusce rutrum nibh a erat condimentum laoreet. Nullam eu hendrerit 
sapien. Suspendisse id lobortis urna. Maecenas ut suscipit nisi. Proin et metus at 
urna euismod sollicitudin eu at mi. Aliquam ac egestas magna. Quisque ac vestibulum 
lectus. Duis ac libero magna, et volutpat odio. Cras mollis tincidunt nibh vel rutrum.
Curabitur fringilla, ante eget scelerisque rhoncus, libero nisl porta leo, ac
vulputate mi erat vitae felis. Praesent auctor fringilla rutrum. Aenean sapien ligula,
imperdiet sodales ullamcorper ut, vulputate at enim.


---- Bravo ---- Delta
Donec cursus tincidunt pellentesque. Maecenas neque nisi, dignissim ac aliquet ac,
vestibulum ut tortor. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Aenean ullamcorper dapibus accumsan. Aenean eros
tortor, ultrices at adipiscing sed, lobortis nec dolor. Fusce eros ligula, posuere
quis porta nec, rhoncus et leo. Curabitur turpis nunc, accumsan posuere pulvinar eget,
sollicitudin eget ipsum. Sed a nibh ac est porta sollicitudin. Pellentesque ut urna ut 
risus pharetra mollis tincidunt sit amet sapien. Sed semper sollicitudin eros quis 
pellentesque. Curabitur ac metus lorem, ac malesuada ipsum. Nulla turpis erat, congue 
eu gravida nec, egestas id nisi. Praesent tellus ligula, pretium vitae ullamcorper 
vitae, gravida eu ipsum. Cras sed erat ligula.


---- Alpha ---- Zeta
Cras id condimentum lectus. Sed sit amet odio eros, ut mollis sapien. Etiam varius 
tincidunt quam nec mattis. Nunc eu varius magna. Maecenas id ante nisl. Cras sed augue 
ipsum, non mollis velit. Fusce eu urna id justo sagittis laoreet non id urna. Nullam 
venenatis tincidunt gravida. Proin mattis est sit amet dolor malesuada sagittis. 
Curabitur in lacus rhoncus mi posuere ullamcorper. Phasellus eget odio libero, ut 
lacinia orci. Pellentesque iaculis, ligula at varius vulputate, arcu leo dignissim 
massa, non adipiscing lectus magna nec dolor. Quisque in libero nec orci vestibulum 
dapibus. Nulla turpis massa, varius quis gravida eu, bibendum et nisl. Fusce tincidunt 
laoreet elit, sed egestas diam pharetra eget. Maecenas lacus velit, egestas nec tempor 
eget, hendrerit et massa.
+++++++++++++++++++++更新++++++++++++++++++++++++++++++++

下面的代码确实有效-它在标题类型行上匹配-打印该行及其后的每一行,直到下一个标题类型模式-即不匹配,跳过直到下一个标题类型模式

唯一的问题是——它真的很慢。穿过10米长的线路大约需要一分钟

re1='(-)'   # Any Single Character 1
re2='(-)'   # Any Single Character 2
re3='(-)'   # Any Single Character 3
re4='(-)'   # Any Single Character 4
re5='( )'   # White Space 1
re6='(Alpha)'  # Word 1
re6a='((?:[a-z][a-z]+))'   # Word 1 alternate
re7='( )'   # White Space 2
re8='(-)'   # Any Single Character 5
re9='(-)'   # Any Single Character 6
re10='(-)'  # Any Single Character 7
re11='(-)'  # Any Single Character 8
re12='(\\s+)'  # White Space 3
re13='(Zeta)'  # Word 2
re13a='((?:[a-z][a-z]+))'  # Word 2 alternate


rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10+re11+re12+re13,re.IGNORECASE|re.DOTALL)
rga = re.compile(re1+re2+re3+re4+re5+re6a+re7+re8+re9+re10+re11+re12+re13a,re.IGNORECASE|re.DOTALL)



linestop = 0
fh = open('test.txt', 'r')

for line in fh:
    if linestop == 0:
        if re.match(rg, line):
            print line
            linestop = 1
    else:
        if re.match(rga, line):
            linestop = 0
        else:
            print line

fh.close()
+++++++++如果我先添加一个grep部分,我想这会大大加快速度。i、 grep out-然后运行上面的正则表达式脚本

我让os.system运行良好-我看不出如何通过pOpen传递正则表达式匹配

******最终更新************

我认为这已经完成了。我最后做的是:

  • Grep使用os.system浏览文件,并写出结果
  • 在中读取文件并使用上面的re.match-仅打印出必要的项目

最终的结果是,读取一个1000万行文件(打印出必要的项目)所需的时间从大约65秒增加到了大约3.5秒。我希望我能想出如何通过除os.system之外的grep,但也许它在python 2.4中没有很好地实现,您仍然在与行进行匹配,这不会改变,因为您仍然处于for循环的同一个迭代中。

我看不出有任何必要在这里使用regex。并不是说它们很糟糕,但是如果你在寻找这样一种特定的模式,那么使用正则表达式就太过分了。试着这样做:

def record(filename, pattern):
    with open(filename) as file:
        recording = False
        for line in file:
            if line.startswith(pattern):
                yield line
                recording = not recording
            elif recording:
                yield line
使用文件名和模式调用
record
,将生成一个一行接一行的生成器对象。这在处理大文件时会更好,因此您不必立即将它们读入

然后,打印行可以这样工作-假设您的文件名为
example.txt

for rec in record(filename, '---- Alpha ---- Zeta'):
    print rec
准确地说:
记录
生成器生成包含换行符的行,因此您可能希望
将它们重新连接在一起,而不需要任何额外的换行符:

print "".join(list(record(filename, '---- Alpha ---- Zeta')))

谢谢你,Jellybean,我得到了一个无效的语法。并发现带有open的
为2.5或更高版本。我在2.4.3上-很抱歉我应该把它放在我的帖子里。没问题,只要把
替换为open(filename)as file
替换为
file=open(filename)
我想它就可以工作了。它开始打印第一个匹配的----Alpha---Zeta,然后打印之后的所有内容,直到下一个匹配的----Alpha---Zeta,它不会打印出来。这难道不需要一些方法来告诉生成器在遇到不匹配的----类型行时停止记录/生成吗?啊,您希望在任何情况下输出匹配行。。。好的,我会根据您的需要调整代码。谢谢,但不会有太多更改。它仍然打印出不匹配的线条,除了现在打印出第二个匹配的----α----泽塔。我设法让一些代码工作,我将用我现在使用的编辑我的问题。我对你的问题有点困惑。您真的只是想模拟基本范围操作符的标准sed、awk或perl行为,如
sed-ne'/foo/、/bar/p'
perl-ne'print if/foo//python中的bar/'
是否需要一个简单的触发器操作符?请注意,
是不同的,因为
会在LHS变为真时测试RHS,而
会等到下次。这就像
++i
i--
之间的区别一样,这是两个更基本的运算符,您仍然需要在python中从头重写。它的整体应用是什么?这实际上是整个问题的开始-但它确实把我的注意力集中到了一个循环上。亨斯给出了公认的答案。