两位数和连字符的正则表达式

时间:2012-02-02 10:12:36

标签: python regex

我昨晚有一个很长的文本文件。愚蠢的是我忘了用"\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,-

3 个答案:

答案 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)