我有很多檔案夾(在 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,當年份等于時小于 03 2022)。我嘗試了類似的東西(同時用 03、2021 和 2022 替換變數)。
date_regex="([0-9]{2}[03-12]2021)|([0-9]{2}[01-03]2022)"
有什么提示我可以如何執行這樣的任務!
提前致謝
uj5u.com熱心網友回復:
如果我正確理解你的問題。
要從檔案名欄位中查找我們在??-03-2021和??-03-2022之間的日期,您可以使用以下正則運算式
date_regex="([0-9]{2}-03-2021)|([0-9]{2}-03-2022)"
此外,如果您想進行更多定制,最好應用下面鏈接中的更改并利用它
https://regex101.com/r/AgqFfH/1
更新:提取日期在 14032021 和 14032022 之間的任何檔案夾
解決方案:首先我們用 ridge 提取 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 格式的日期,然后假設我們的格式正確并且在其中找到這樣的短語,我們給出檔案。
我希望這個解決方案有所幫助。
uj5u.com熱心網友回復:
它當然不漂亮,但是你去:
#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:月份小于并且是結束年份,這將需要任何一天。
這是一個例子:https ://regex101.com/r/i76s58/1
uj5u.com熱心網友回復:
比較日期,使用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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445154.html
上一篇:可以用PEG表示/\s(foo|bar|baz)\s.*/
下一篇:用于將括號中的文本“[ab][ij][yz]”拆分為[“[ab]”、“[ij]”、“[yz]”]串列的正則運算式
