gpt4 book ai didi

python - 使用正则表达式的最近 12 小时文件

转载 作者:行者123 更新时间:2023-11-28 23:02:55 25 4
gpt4 key购买 nike

我正在尝试获取过去 12 小时内的所有文件,文件名具有以下格式 %Y-%m-%d %H

这是我的 python 脚本,我正在努力工作

last12HourDateTime = datetime.today() - timedelta(hours = 12)
allowedFormat = last12HourDateTime.strftime('%Y-%m-%d %H')


for filePath in glob.glob(allowedFormat):

我知道有很多方法可以做到,但我想知道这种方法是否可行

(编辑)我能够完成它

allowedFormats =[]
for i in range (1,12):
last12HourDateTime = datetime.today() - timedelta(hours = (i - 1))
allowedFormats.append(last12HourDateTime.strftime('%Y-%m-%d-%H.log'))


for allowedFormat in allowedFormats:
for filePath in glob.glob(allowedFormat):

还在寻找更高效的解决方案

最佳答案

技术上:是的。

值得:不。

原因:Regex 不理解数值,因此不能进行算术比较 (x > z - 12)。

换句话说:您必须为每次使用生成自定义正则表达式,因此最好使用真正的日期格式解析器和能够满足您要求的日期类,如正则表达式你必须产生大量的 ANDed (...|...) 组并且几乎以基本的批处理字符串比较结束(这在技术上是仍然是有效的正则表达式,但缺少任何更高的用途)。


大多数与文本相关的问题,如 “Is x possible in regex?” 在技术上可以用 YES 来回答。 (见上文)

因此我更愿意问:“我应该(尝试)用正则表达式做 x 吗?”“正则表达式是 x 的正确工具吗?”

如果你唯一的工具是锤子......


如果你想至少缩小潜在匹配列表的范围(在进行任何实际日期算术之前),你必须根据这些规则生成一个正则表达式(从我的头脑来看,没有保证)

(我将使用 h 表示当前小时,d 表示当天,m 表示当前月份,y 为当年。)

if (h < 12)
%dh = '(?:yesterday (?:1[2-9]|2[0-3])|today [0-9]{1,2})'
else
%dh = '(?:tomorrow (?:[0-9]|1[0-1])|today [0-9]{1,2})'

if (d == 1)
%m = '(?:lastmonth|thismonth)'
else if (d == 31 && count of days in m == 31 ||
d == 30 && count of days in m == 30 ||
m == 2 && d == 28 ||
m == 2 && d == 29 && y is leap year)
%m = '(?:thismonth|nextmonth)'
else
%m = 'thismonth'

if (m == 1)
%y = '(lastyear|thisyear)'
else if (m == 12)
%y = '(?:thisyear|nextyear)'
else
%y = 'thisyear'

yesterdaythisyear 等替换为各自的数值。

并形成一个模式 %y-%m-%dh 的正则表达式,您将在其中替换 %y%m%dh 具有上面确定的值。

同样:日期算法很棘手,因此我上面的算法可能包含错误。


我不知道你的问题的更广泛背景,所以我只能猜测。根据您提供的信息(并假设文件名/文件不会在每次搜索时发生 100% 的变化,从而允许一定程度的缓存),我可能会这样处理:

枚举你的文件列表并将它们的日期格式的文件名转换为 UNIX 时间戳,将它们中的每一个添加到列表中(可能更好:创建包含时间戳和文件路径的容器对象,否则你必须通过转换来获取文件路径时间戳返回日期格式的字符串并要求层次结构是扁平的)。对列表进行排序。使用修改后的二进制搜索获取匹配文件的范围(在这种搜索中,您搜索一系列相对匹配而不是实际值匹配。我现在没有示例代码,但这并不难)。

现在假设文件不时被添加/删除,您要么必须能够监视这些系统事件并更新您的列表。

第一次创建列表需要 O(n)(+ O(nlogn) 用于排序)但是如果您能够巧妙地更新缓存的时间戳列出你应该能够获得相当多的性能。

关于python - 使用正则表达式的最近 12 小时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com