python正则表达式来自大文本文件的特定文本块

时间:2015-10-06 14:46:41

标签: performance

我是python和这个网站的新手,所以提前感谢你...理解。这是我第一次尝试使用python脚本。

我正在尝试解决此问题的性能问题导致我无法获取任何数据。

此代码适用于几页的小文本文件,但是当我尝试在我的35MB实际数据文本文件上使用它时,它只是命中CPU并且没有返回任何数据(现在> 24小时)。

以下是35MB文本文件中的实际数据片段:

D)dddld
d00d90d
dd

ddd

vsddfgsdfgsf

dfsdfdsf
aAAAAAa

221546
29806916295
Meowing
fs:/mod/umbapp/umb/sentbox/221546.pdu
2013:10:4:22:11:31:4

sadfsdfsdf
sdfff
ff
f

29806916295
What's your cat doing?
fs:/mod/umbapp/umb/sentbox/10955.pdu
2013:10:4:22:10:15:4

aaa
aaa
aaaaa

我正在尝试将其复制到新文件中:

29806916295
Meowing
fs:/mod/umbapp/umb/sentbox/221546.pdu
2013:10:4:22:11:31:4

29806916295
What's your cat doing?
fs:/mod/umbapp/umb/sentbox/10955.pdu
2013:10:4:22:10:15:4

我的Python代码是:

import re

with open('testdata.txt') as myfile:
    content = myfile.read()

text = re.search(r'\d{11}.*\n.*\n.*(\d{4})\D+(\d{2})\D+(\d{1})\D+(\d{2})\D+(\d{2})\D+\d{2}\D+\d{1}', content, re.DOTALL).group()
with open("result.txt", "w") as myfile2:
    myfile2.write(text)

1 个答案:

答案 0 :(得分:0)

正则表达式不是搜索字符串的最快方式。您还通过使用非常大的字符串(35MB)来解决问题。通常不建议将整个文件读入内存,因为可能会遇到内存问题。

从您的正则表达式模式判断,您似乎想要捕获以11位数字符串开头并以某个时间线字符串结尾的4行组。试试这段代码:

import re

start_pattern = re.compile(r'^\d{11}$')
end_pattern   = re.compile(r'^\d{4}\D+\d{2}\D+\d{1}\D+\d{2}\D+\d{2}\D+\d{2}\D+\d{1}$')

capturing = 0
capture   = ''

with open('output.txt', 'w') as output_file:
    with open('input.txt', 'r') as input_file:
        for line in input_file:
            if capturing > 0 and capturing <= 4:
                capturing += 1
                capture   += line                
            elif start_pattern.match(line):
                capturing = 1
                capture   = line

            if capturing == 4:
                if end_pattern.match(line):
                    output_file.write(capture + '\n')
                else:
                    capturing = 0

逐行迭代输入文件。如果找到与start_pattern匹配的行,则会再读取3行。如果第4行与end_pattern匹配,它会将整个组写入输出文件。