我需要分析存储桶中的一些数据,并且遇到了一些难题。 这是每个文件中的行的类型:
“ 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字符串中?
答案 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+)(.*)$
该图显示了表达式的工作方式:
# -*- 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性能测试,可重复输入字符串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**