Azure 路径中日期为字符串的正则表达式
Regex with date as String in Azure path
我有很多文件夹(在 Microsoft Azure 数据湖中),每个文件夹都以日期命名,格式为“ddmmyyyy”。通常,我使用正则表达式提取一年中确切月份的所有文件夹的所有文件
path_data="/mnt/data/[0-9]*032022/data_[0-9]*.json" # all folders of all days of month 03 of 2022
result=spark.read.json(path_data)
我现在的问题是提取与给定日期前一年完全匹配的所有文件夹
例如:对于日期 14-03-2022;我需要一个正则表达式来自动读取 14-03-2021 和 14-03-2022 之间所有文件夹的所有文件。
我尝试使用字符串在 vars 中提取月份和年份,然后在符合条件的正则表达式中使用这两个字符串(对于所示示例,当年份等于 2021 时月份应大于 03,当年份等于 2021 时月份应小于 03年等于 2022 年)。我尝试了类似的东西(同时用 03、2021 和 2022 替换变量)。
date_regex="([0-9]{2}[03-12]2021)|([0-9]{2}[01-03]2022)"
是否有任何提示我可以如何执行这样的任务!
提前致谢
如果我理解正确的话。
要从文件名字段中找到 ??-03-2021 和 ??-03-2022 之间的日期,您可以使用下面的正则表达式
date_regex="([0-9]{2}-03-2021)|([0-9]{2}-03-2022)"
此外,如果您想更加个性化,最好应用下面 link 的更改并加以利用
https://regex101.com/r/AgqFfH/1
update : 提取任何以 14032021 和 14032022
之间的日期命名的文件夹
解决方案 : 首先我们提取ddmmyyyy格式的带脊线的日期,然后我们给出文件假设我们的格式是正确的并且在其中找到这样的短语
date_regex="((0[1-9]|1[0-9]|2[0-8])|(0[1-9]|1[012]))"
if re.find(r"((0[1-9]|1[0-9]|2[0-8])|(0[1-9]|1[012]))") > 14032021 and re.find(r"((0[1-9]|1[0-9]|2[0-8])|(0[1-9]|1[012]))") < 14032022
..do any operation..
以上代码只是通宵代码,供大家大致了解一下解决方法。
首先我们用正则表达式提取 ddmmyyyy 格式的日期,然后我们给出文件,假设我们的格式是正确的,并且在其中找到这样的短语。
希望此解决方案有所帮助。
要比较日期,请使用 datetime
模块,示例如下。
那么你只能提取符合条件的文件夹
# importing datetime module
import datetime
# date in yyyy/mm/dd format
d1 = datetime.datetime(2018, 5, 3)
d2 = datetime.datetime(2018, 6, 1)
# Comparing the dates will return
# either True or False
print("d1 is greater than d2 : ", d1 > d2)
print("d1 is less than d2 : ", d1 < d2)
print("d1 is not equal to d2 : ", d1 != d2)
当然不是很漂亮,但是给你:
#input
day = "14"; month = "03"; startYear = "2021";
#day construction
sameTensAfter = '(' + day[0] + '[' + day[1] + '-9])';
theDaysAfter = '([' + chr(ord(day[0])+1) + '-9][0-9])';
sameTensBefore = '(' + day[0] + '[0-' + day[1] + '])';
theDaysBefore = '';
if day[0] != '0':
theDaysBefore = '([0-' + chr(ord(day[0])-1) + '][0-9])';
#build the part for the dates with the same month as query
afterDayPart = '%s|%s' %(sameTensAfter, theDaysAfter);
beforeDayPart = '%s|%s' %(sameTensBefore, theDaysBefore);
theMonthAfter = str(int(month) + 1).zfill(2);
afterMonthPart = theMonthAfter[0] + '([' + theMonthAfter[1] + '-9])';
if theMonthAfter[0] == '0':
afterMonthPart += '|(1[0-2])';
theMonthBefore = str(int(month) - 1).zfill(2);
beforeMonthPart = theMonthBefore[0] + '([0-' + theMonthBefore[1] + '])';
if theMonthBefore[0] == '1':
beforeMonthPart = '(0[0-9])|' + beforeMonthPart;
#4 kinds of matches:
startDateRange = '((%s)(%s)(%s))' %(afterDayPart, month, startYear);
anyDayAfterMonth = '((%s)(%s)(%s))' %('[0-9]{2}', afterMonthPart, startYear);
endDateRange = '((%s)(%s)(%s))' %(beforeDayPart, month, int(startYear)+1);
anyDayBeforeMonth = '((%s)(%s)(%s))' %('[0-9]{2}', beforeMonthPart, int(startYear)+1);
#print regex
date_regex = startDateRange + '|' + anyDayAfterMonth + '|' + endDateRange + '|' + anyDayBeforeMonth;
print date_regex;
#this prints:
#(((1[4-9])|([2-9][0-9]))(03)(2021))|(([0-9]{2})(0([4-9])|(1[0-2]))(2021))|(((1[0-4])|([0-0][0-9]))(03)(2022))|(([0-9]{2})(0([0-2]))(2022))
startDateRange
: 月份相同且是起始年,这将需要包括和之后的所有天数。
anyDayAfterMonth
: 月份比较大,而且是起始年份,这将需要任何一天。
endDateRange
: 月份相同且是结束年份,这将占用包括和之前的所有天数。
anyDayBeforeMonth
: 月份小于,是结束年份,这将需要任何一天。
我有很多文件夹(在 Microsoft Azure 数据湖中),每个文件夹都以日期命名,格式为“ddmmyyyy”。通常,我使用正则表达式提取一年中确切月份的所有文件夹的所有文件
path_data="/mnt/data/[0-9]*032022/data_[0-9]*.json" # all folders of all days of month 03 of 2022
result=spark.read.json(path_data)
我现在的问题是提取与给定日期前一年完全匹配的所有文件夹
例如:对于日期 14-03-2022;我需要一个正则表达式来自动读取 14-03-2021 和 14-03-2022 之间所有文件夹的所有文件。
我尝试使用字符串在 vars 中提取月份和年份,然后在符合条件的正则表达式中使用这两个字符串(对于所示示例,当年份等于 2021 时月份应大于 03,当年份等于 2021 时月份应小于 03年等于 2022 年)。我尝试了类似的东西(同时用 03、2021 和 2022 替换变量)。
date_regex="([0-9]{2}[03-12]2021)|([0-9]{2}[01-03]2022)"
是否有任何提示我可以如何执行这样的任务!
提前致谢
如果我理解正确的话。
要从文件名字段中找到 ??-03-2021 和 ??-03-2022 之间的日期,您可以使用下面的正则表达式
date_regex="([0-9]{2}-03-2021)|([0-9]{2}-03-2022)"
此外,如果您想更加个性化,最好应用下面 link 的更改并加以利用
https://regex101.com/r/AgqFfH/1
update : 提取任何以 14032021 和 14032022
之间的日期命名的文件夹解决方案 : 首先我们提取ddmmyyyy格式的带脊线的日期,然后我们给出文件假设我们的格式是正确的并且在其中找到这样的短语
date_regex="((0[1-9]|1[0-9]|2[0-8])|(0[1-9]|1[012]))"
if re.find(r"((0[1-9]|1[0-9]|2[0-8])|(0[1-9]|1[012]))") > 14032021 and re.find(r"((0[1-9]|1[0-9]|2[0-8])|(0[1-9]|1[012]))") < 14032022
..do any operation..
以上代码只是通宵代码,供大家大致了解一下解决方法。
首先我们用正则表达式提取 ddmmyyyy 格式的日期,然后我们给出文件,假设我们的格式是正确的,并且在其中找到这样的短语。
希望此解决方案有所帮助。
要比较日期,请使用 datetime
模块,示例如下。
那么你只能提取符合条件的文件夹
# importing datetime module
import datetime
# date in yyyy/mm/dd format
d1 = datetime.datetime(2018, 5, 3)
d2 = datetime.datetime(2018, 6, 1)
# Comparing the dates will return
# either True or False
print("d1 is greater than d2 : ", d1 > d2)
print("d1 is less than d2 : ", d1 < d2)
print("d1 is not equal to d2 : ", d1 != d2)
当然不是很漂亮,但是给你:
#input
day = "14"; month = "03"; startYear = "2021";
#day construction
sameTensAfter = '(' + day[0] + '[' + day[1] + '-9])';
theDaysAfter = '([' + chr(ord(day[0])+1) + '-9][0-9])';
sameTensBefore = '(' + day[0] + '[0-' + day[1] + '])';
theDaysBefore = '';
if day[0] != '0':
theDaysBefore = '([0-' + chr(ord(day[0])-1) + '][0-9])';
#build the part for the dates with the same month as query
afterDayPart = '%s|%s' %(sameTensAfter, theDaysAfter);
beforeDayPart = '%s|%s' %(sameTensBefore, theDaysBefore);
theMonthAfter = str(int(month) + 1).zfill(2);
afterMonthPart = theMonthAfter[0] + '([' + theMonthAfter[1] + '-9])';
if theMonthAfter[0] == '0':
afterMonthPart += '|(1[0-2])';
theMonthBefore = str(int(month) - 1).zfill(2);
beforeMonthPart = theMonthBefore[0] + '([0-' + theMonthBefore[1] + '])';
if theMonthBefore[0] == '1':
beforeMonthPart = '(0[0-9])|' + beforeMonthPart;
#4 kinds of matches:
startDateRange = '((%s)(%s)(%s))' %(afterDayPart, month, startYear);
anyDayAfterMonth = '((%s)(%s)(%s))' %('[0-9]{2}', afterMonthPart, startYear);
endDateRange = '((%s)(%s)(%s))' %(beforeDayPart, month, int(startYear)+1);
anyDayBeforeMonth = '((%s)(%s)(%s))' %('[0-9]{2}', beforeMonthPart, int(startYear)+1);
#print regex
date_regex = startDateRange + '|' + anyDayAfterMonth + '|' + endDateRange + '|' + anyDayBeforeMonth;
print date_regex;
#this prints:
#(((1[4-9])|([2-9][0-9]))(03)(2021))|(([0-9]{2})(0([4-9])|(1[0-2]))(2021))|(((1[0-4])|([0-0][0-9]))(03)(2022))|(([0-9]{2})(0([0-2]))(2022))
startDateRange
: 月份相同且是起始年,这将需要包括和之后的所有天数。
anyDayAfterMonth
: 月份比较大,而且是起始年份,这将需要任何一天。
endDateRange
: 月份相同且是结束年份,这将占用包括和之前的所有天数。
anyDayBeforeMonth
: 月份小于,是结束年份,这将需要任何一天。