从包含大量数字的字符串中提取日期
Extract date from a string with a lot of numbers
似乎有很多方法可以从字符串中提取各种格式的日期时间。但是当字符串包含很多数字和符号时似乎会出现问题。
这是一个例子:
t = 'Annual Transmission Revenue Requirements and Rates Transmission Owner (Transmission Zone) Annual Transmission Revenue Requirement Network Integration Transmission Service Rate ($/MW-Year) AE (AECO) 6,632,319 ,775 AEP (AEP) ,295,660,732 ,818.14 AP (APS) 8,000,000 ,895 ATSI (ATSI) 9,094,666 ,689.39 BC (BGE) 0,595,535 ,762 ComEd, Rochelle (CE) 2,431,433 ,515.60 Dayton (DAY) ,100,000 ,295.76 Duke (DEOK) 1,250,903 ,077 Duquesne (DLCO) 9,341,808 ,954.44 Dominion (DOM) ,031,382,000 ,457.21 DPL, ODEC (DPL) 3,224,128 ,812 East Kentucky Power Cooperative (EKPC) ,267,903 ,441 MAIT (METED, PENELEC) 0,858,703 ,069.39 JCPL 5,000,000 ,597.27 PE (PECO) 5,439,100 ,093 PPL, AECoop, UGI (PPL) 5,349,329 ,865 PEPCO, SMECO (PEPCO) 0,876,083 ,304.21 PS (PSEG) ,248,819,352 0,535.22 Rockland (RECO) ,724,263 ,799 TrAILCo 6,652,117.80 n/a Effective June 1, 2018 '
import datefinder
m = datefinder.find_dates(t)
for match in m:
print(match)
有没有办法顺利提取日期?如果没有更好的方法,我可以求助于 re
来获取特定格式。从datefinder
的github看好像是一年前就废弃了
虽然我不知道您的日期是如何格式化的,但这里有一个正则表达式解决方案,可以处理以“/”分隔的日期。应该使用月份和日期表示为单个数字或包含前导零的日期。
如果您的日期由连字符分隔,请将正则表达式的第 9 和第 18 个字符替换为连字符而不是 /。 (如果使用第二条打印语句,替换第12和31个字符)
编辑:添加了第二个带有更好正则表达式的打印语句。这可能是更好的方法。
import re
mystring = r'joasidj9238nlsd93901/01/2021oijweo8939n'
print(re.findall('\d{1,2}\/\d{1,2}\/\d{2,4}', mystring)) # This would probably work in most cases
print(re.findall('[0-1]{0,2}\/[0-3]{0,1}\d{0,1}\/\d{2,4}', mystring)) # This one is probably a better solution. (More protection against weirdness.)
编辑 #2:这是一种使用拼写月份名称(完整或 3 个字符的缩写)、日、逗号、2 位或 4 位年份的方法。
import re
mystring = r'Jan 1, 2020'
print(re.findall(r'(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}\,\s+\d{2,4}',mystring))
似乎有很多方法可以从字符串中提取各种格式的日期时间。但是当字符串包含很多数字和符号时似乎会出现问题。
这是一个例子:
t = 'Annual Transmission Revenue Requirements and Rates Transmission Owner (Transmission Zone) Annual Transmission Revenue Requirement Network Integration Transmission Service Rate ($/MW-Year) AE (AECO) 6,632,319 ,775 AEP (AEP) ,295,660,732 ,818.14 AP (APS) 8,000,000 ,895 ATSI (ATSI) 9,094,666 ,689.39 BC (BGE) 0,595,535 ,762 ComEd, Rochelle (CE) 2,431,433 ,515.60 Dayton (DAY) ,100,000 ,295.76 Duke (DEOK) 1,250,903 ,077 Duquesne (DLCO) 9,341,808 ,954.44 Dominion (DOM) ,031,382,000 ,457.21 DPL, ODEC (DPL) 3,224,128 ,812 East Kentucky Power Cooperative (EKPC) ,267,903 ,441 MAIT (METED, PENELEC) 0,858,703 ,069.39 JCPL 5,000,000 ,597.27 PE (PECO) 5,439,100 ,093 PPL, AECoop, UGI (PPL) 5,349,329 ,865 PEPCO, SMECO (PEPCO) 0,876,083 ,304.21 PS (PSEG) ,248,819,352 0,535.22 Rockland (RECO) ,724,263 ,799 TrAILCo 6,652,117.80 n/a Effective June 1, 2018 '
import datefinder
m = datefinder.find_dates(t)
for match in m:
print(match)
有没有办法顺利提取日期?如果没有更好的方法,我可以求助于 re
来获取特定格式。从datefinder
的github看好像是一年前就废弃了
虽然我不知道您的日期是如何格式化的,但这里有一个正则表达式解决方案,可以处理以“/”分隔的日期。应该使用月份和日期表示为单个数字或包含前导零的日期。
如果您的日期由连字符分隔,请将正则表达式的第 9 和第 18 个字符替换为连字符而不是 /。 (如果使用第二条打印语句,替换第12和31个字符)
编辑:添加了第二个带有更好正则表达式的打印语句。这可能是更好的方法。
import re
mystring = r'joasidj9238nlsd93901/01/2021oijweo8939n'
print(re.findall('\d{1,2}\/\d{1,2}\/\d{2,4}', mystring)) # This would probably work in most cases
print(re.findall('[0-1]{0,2}\/[0-3]{0,1}\d{0,1}\/\d{2,4}', mystring)) # This one is probably a better solution. (More protection against weirdness.)
编辑 #2:这是一种使用拼写月份名称(完整或 3 个字符的缩写)、日、逗号、2 位或 4 位年份的方法。
import re
mystring = r'Jan 1, 2020'
print(re.findall(r'(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}\,\s+\d{2,4}',mystring))