RegEx用于匹配日期时间,后跟空格和任何字符

时间:2019-05-06 01:23:55

标签: python regex string split regex-group

我需要分析存储桶中的一些数据,并且遇到了一些难题。 这是每个文件中的行的类型:

“ 2018-09-08 10:34:49 10.0 MiB路径/ of / a /目录

所需的是以粗体捕获所有内容,同时要记住某些分隔符是制表符,而有时它们是空格。

换句话说,我需要从日期和时间结束的那一刻起(不包括制表符或空格)

我尝试过这样的事情:

p = re.compile(r'^[\d\d\d\d.\d\d.\d\d\s\d\d:\d\d:\d\d].*')
for line in lines:
    print(re.findall(line))

如何解决此问题?

编辑: 如果我还想在新匹配的字符串中创建新的组怎么办?说我想将其重新创建为-> 10MiB参与名称/文件夹/文件/something.xlsx参与名称扩展名类型something.xlsx

重新编辑: 路径/到/目录通常指向一个文件(所有文件都有扩展名)。从你们一直在帮助我的重新格式化的字符串中,有一种方法可以继续构建正则表达式模式,以允许我通过对fileExtensionType进行过滤来“创建”新组(我想是通过在字符串的末尾搜索沿着.anything进行排序,然后将结果添加到格式化的regex字符串中?

2 个答案:

答案 0 :(得分:4)

不要理会正则表达式。您知道该行的格式。只需将其拆分即可:

from datetime import datetime

for l in lines:
    line_date, line_time, rest_of_line = l.split(maxsplit=2)
    print([line_date, line_time, rest_of_line])
    # ['2018-09-08', '10:34:49', '10.0 MiB path/of/a/directory']

请特别注意maxsplit参数的使用。这样可以防止其拆分大小或路径。我们之所以这样做,是因为我们知道日期的中间有一个空格,在日期之后有一个空格。

如果尺寸中间总是有一个空格,其后总是一个空格,那么我们也可以将其增加到4个拆分来分开尺寸:

for l in lines:
    line_date, line_time, size_quantity, size_units, line_path = l.split(maxsplit=4)
    print([line_date, line_time, size_quantity, size_units, line_path])
    # ['2018-09-08', '10:34:49', '10.0', 'MiB', 'path/of/a/directory']

请注意,路径中多余的连续空间和空格不会将其弄乱:

l = "2018-09-08 10:34:49     10.0   MiB    path/of/a/direct       ory"
line_date, line_time, size_quantity, size_units, line_path = l.split(maxsplit=4)
print([line_date, line_time, size_quantity, size_units, line_path])
# ['2018-09-08', '10:34:49', '10.0', 'MiB', 'path/of/a/direct       ory']

您可以根据需要将各个部分重新连接在一起:

line_size = size_quantity + ' ' + size_units


如果您想要时间戳记,可以对其进行解析:

# 'T' could be anything, but 'T' is standard for the ISO 8601 format
timestamp = datetime.strptime(line_date + 'T' + line_time, '%Y-%m-%dT%H:%M:%S')

答案 1 :(得分:1)

您可能不需要表达式,字符串分割就足够了。但是,如果您希望这样做,则可能从一开始就不想绑定表达式。您可以简单地使用this expression

(:[0-9]+\s+)(.*)$ 

您甚至可以将其稍微修改为this expression,这只是更快一点:

:([0-9]+\s+)(.*)$

enter image description here

该图显示了表达式的工作方式:

enter image description here


示例测试:

# -*- coding: UTF-8 -*-
import re

string = "2018-09-08 10:34:49   10.0 MiB path/of/a/directory"
expression = r'(:[0-9]+\s+)(.*)$'
match = re.search(expression, string)
if match:
    print("YAAAY! \"" + match.group(2) + "\" is a match  ")
else: 
    print(' Sorry! No matches! Something is not right! Call 911 ')

输出

YAAAY! "10.0 MiB path/of/a/directory" is a match  

JavaScript性能基准

此代码段是JavaScript性能测试,可重复输入字符串1000万次:

repeat = 10000000;
start = Date.now();

for (var i = repeat; i >= 0; i--) {
	var string = "2018-09-08 10:34:49 	10.0 MiB path/of/a/directory";
	var regex = /(.*)(:[0-9]+\s+)(.*)/g;
	var match = string.replace(regex, "$3");
}

end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match  ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");

编辑:

您可能只捕获时间戳记的结尾,因为您的表达式将具有更少的边界,变得更加简单快捷,并且万一发生意外的情况,它仍然可以工作:

2019/12/15 10:00:00     **desired output**
2019-12-15    10:00:00     **desired output**
2019-12-15, 10:00:00     **desired output**
2019-12 15 10:00:00     **desired output**