Python 最近12小时使用Regex的文件

Python 最近12小时使用Regex的文件,python,regex,Python,Regex,我正在尝试获取过去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): 我知道有几十种方法,但我想知道这种方法是否可行 (

我正在尝试获取过去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)

换句话说:您必须为每次使用生成一个自定义正则表达式,因此最好使用一个真正的日期格式解析器和一个能够满足您需要的日期类,因为在正则表达式中,您必须生成大量的
ed
(…|…)
groups,并几乎以基本的批处理字符串比较结束(这可能仍然是有效的正则表达式,但缺乏更高的用途)


大多数与文本相关的问题都是“在正则表达式中x可能吗?”
从技术上讲可以用是回答。(见上文)

因此,我更愿意问:“我应该(尝试)用regex做x吗?”或者“regex是x的正确工具吗?”

如果你唯一的工具是锤子


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

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

if(h<12)
%dh=“(?:昨天(?:1[2-9]| 2[0-3])今天[0-9]{1,2}”
其他的
%dh=“(?:明天(?[0-9]| 1[0-1])|今天[0-9]{1,2}”
如果(d==1)
%m='(?:上个月|这个月)'
如果(d==31&&m==31的天数计数||
d==30&&m==30的天数计数||
m==2&&d==28||
m==2&&d==29&&y是闰年)
%m=“(?:本月|下个月)”
其他的
%m=‘本月’
如果(m==1)
%y='(去年|今年)'
else如果(m==12)
%y=“(?:今年|下一年)”
其他的
%y=‘今年’
您将用各自的数值替换昨天的
今年的
,等等

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

再说一遍:日期算法很复杂,所以我上面的算法可能有错误


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

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

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

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

技术上:是的

值得:不

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

换句话说:您必须为每次使用生成一个自定义正则表达式,因此最好使用一个真正的日期格式解析器和一个能够满足您需要的日期类,因为在正则表达式中,您必须生成大量的
ed
(…|…)
groups,并几乎以基本的批处理字符串比较结束(这可能仍然是有效的正则表达式,但缺乏更高的用途)


大多数与文本相关的问题都是“在正则表达式中x可能吗?”
从技术上讲可以用是回答。(见上文)

因此,我更愿意问:“我应该(尝试)用regex做x吗?”或者“regex是x的正确工具吗?”

如果你唯一的工具是锤子


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

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

if(h<12)
%dh=“(?:昨天(?:1[2-9]| 2[0-3])今天[0-9]{1,2}”
其他的
%dh=“(?:明天(?[0-9]| 1[0-1])|今天[0-9]{1,2}”
如果(d==1)
%m='(?:上个月|这个月)'
如果(d==31&&m==31的天数计数||
d==30&&m==30的天数计数||
m==2&&d==28||
m==2&&d==29&&y是闰年)
%m=“(?:本月|下个月)”
其他的
%m=‘本月’
如果(m==1)
%y='(去年|今年)'
else如果(m==12)
%y=“(?:今年|下一年)”
其他的
%y=‘今年’
您将用各自的数值替换昨天的
今年的
,等等

并形成一个模式为
%y-%m-%dh
的正则表达式,其中替换
%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'