我昨晚有一个很长的文本文件。愚蠢的是我忘了用"\n"
正确格式化它。样本是:
"01-someText151645.txt,Wed Feb 1 16:15:18 2012,1328112918.57801-HalfMeg151646.txt,Wed Feb 1 16:15:18 2012,1328112918.578"... on and on.
如您所见,纪元时间戳的结尾与文本文件名之间没有空格。幸运的是,每个文本文件都以两个数字和一个连字符开头。所以上面的示例应如下所示:
01-someText151645.txt,Wed Feb 1 16:15:18 2012,1328112918.578 01-someText151646.txt,Wed Feb 1 16:15:18 2012,1328112918.578
不幸的是,我之前进行过大量Regex解析的项目并不适合,因此需要一些帮助才能获得正则表达式。我的计划是使用re.findall(regex, sample)
来获取我想要的信息。
编辑:只是明确地说每行都有一个文本文件名,一个日期和纪元时间戳,所有都用“,”(无空格)分隔。每个文件以2位数字和连字符开头。这就是:textfile,date,epoch
,textfile = digit,digit,-
答案 0 :(得分:3)
这是我扔在一起的东西,操纵它以适应:
import re
m = """01-someText151645.txt,Wed Feb 1 16:15:18 2012,1328112918.57801-HalfMeg151646.txt,Wed Feb 1 16:15:18 2012,1328112918.578"""
print(m)
addNewLineBefore = lambda matchObject: "\n" + matchObject.group(0)
print ( re.sub(r'\d{2}-',addNewLineBefore,m) )
当然,假设\d{2}-
匹配对于行的开头是唯一的。如果有可能它们出现在行内,例如在文件名中,请提及它,我将编辑此答案以适应
编辑:如果您不想将整个文件读入内存,可以使用缓冲区:
import re
input = open("infile","r")
output = open("outfile","w")
oneLine = re.compile(r"""(
\d{2}- # the beginning of the line
.+? # the middle of the line
\.\d{3} # the dot and three digits at the end
)""", re.X)
while buffer:
buffer = input.read(6000) # adjust this to suit
#newbuffer = re.split(r'(\d{2}-.+?\.\d{3})',buffer) # I'll use the commented re object above
newbuffer = oneLine.split(buffer)
newbuffer = filter(None,newbuffer)
output.write( "\n".join(newbuffer) )
input.close()
output.close()
如果错误检查和效率是必需品,则不应使用此功能。据我所知,这是一个非常有控制和非正式的环境
答案 1 :(得分:1)
在这里,试试这个:
([0-9]{2}-[a-zA-Z]{5,}[0-9]{5,}\.txt){1,}
这将匹配(紧密但松散地)您的文件名格式。您可以根据自己的需要进行调整。
对此进行拆分,然后相应地分开文件。
答案 2 :(得分:0)
如果您的文件足够小,无法一次性读入内存,那么您只需将其拆分为前瞻性正则表达式
re.split('(?=\d\d-)', contents)
或在他们所属的地方插入换行符
re.sub('(?=\d\d-)', "\n", contents)