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

2024-10-17 06:16:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

正如您所看到的,epoch时间戳的结尾和文本文件名之间没有空格。幸运的是,每个文本文件都以两个数字和一个连字符开头。所以上面的例子应该是这样的:

01-someText151645.txt,Wed Feb  1 16:15:18 2012,1328112918.578
01-someText151646.txt,Wed Feb  1 16:15:18 2012,1328112918.578

不幸的是,之前的一个项目,我有很多正则表达式解析是不手,因此需要一个小帮助,为这个正则表达式。我的计划是用re.findall(regex, sample)来获取我想要的信息。

编辑:只是明确地说每一行有一个文本文件名、一个日期和纪元时间戳,都用“,”隔开(没有空格)。每个文件以2位数字和连字符开头。那就是:textfile,date,epoch,textfile=digit,digit,-


Tags: txton时间数字字符feb样本空格
3条回答

这里,试试这个:

([0-9]{2}-[a-zA-Z]{5,}[0-9]{5,}\.txt){1,}

这将匹配(紧密但松散)文件名的格式。你可以适应你的需要。

对此进行拆分,然后相应地分离文件。

如果您的文件足够小,可以同时将其读入内存,那么您只需在lookahead regex上对其进行拆分

re.split('(?=\d\d-)', contents)

或者在它们所属的地方插入新行

re.sub('(?=\d\d-)', "\n", contents)

以下是我总结出来的,利用它来适应:

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()

如果错误检查和效率是必需的,则不应使用此选项。据我所知,这是一个非常受控制的非正式环境

相关问题 更多 >