导入库

import re<br />import jieba.posseg as psg<br />from datetime import datetime,timedelta<br />from dateutil.parser import parse

`# 对句子进行解析,提取其中所有能表示时间日期的词
_def time_extract(text):
time_res = []
# 存放识别出的时间的列表
word = “” # 存放表示时间的词
keyDate = {“昨天”:-1,”今天”:0,”明天”:1,”后天”:2,} # 时间字典
# 对句子进行分词
for k,v in psg.cut(text): # k:词,v:词性
# 判断当前词是否在时间字典中,若在,则计算出该词指向的时间
if k in keyDate: # 若当前词K在时间字典中
if word != “”: # 且暂存时间词的变量word为不空,即已经暂存了一个表示时间的词
time_res.append(word) # 将该词(时间)添加到用于存放表示时间的词的列表timeres
# 且word为空,则将当前时间与识别出的时间词表示的天数相加,表示实际指向的日期。并进行格式化,赋值给word
# days = keyDate.get(k,0):返回键为k在时间字典中的值,并标记为天数
_word = (datetime.today() + timedelta(days=keyDate.get(k,0))).strftime(“%Y年%m月%d日”)
# .strftime(格式):格式化时间的格式
# 若word不空,对其他非日期的时间词进行提取
elif word != “”: # 若当前词k不在时间词典,且暂存时间词的变量word为不空,即已经暂存了一个表示时间的词
if v in [“m”,”t”]: # 若k的词性v为 数词 或 时间词
word = word + k # 则将该词累加到word上
else: # 否则,即k不在时间词典且word为空
time_res.append(word) # 将word添加到timeres
_word = “”
# 将word重新置为空
elif v in [“m”,”t”]:
word = k
if word != “”:
time_res.append(word)
print(“识别出的时间:”,time_res)
return time_res
# 返回对句子中日期进行了处理的结果

提取出表示一天中表示时间的词,并对其规范化
def parse_datetime(msg):
# 正则表达式 年月日时分秒
p = r’([0-9零一二两三四五六七八九十]+年)?([0-9零一二两三四五六七八九十]+月)?([0-9零一二两三四五六七八九十]+[号日])?’ \
r’([上中下午晚早]+)?([0-9零一二两三四五六七八九十百]+[点:.时])?([0-9零一二两三四五六七八九十百]+分?)?([0-9零一二两三四五六七八九十百]+秒)?’
# rs = re.findall(p,msg)
# print(rs)
m = re.match(p,msg) # 得到的经过正则匹配的值
if m.group(0) is not None: # 若m非空
res = {
“year”:m.group(1) if m.group(1) is not None else datetime.today().year,
“moon”:m.group(2) if m.group(2) is not None else datetime.today().month,
“day”:m.group(3) if m.group(3) is not None else “01”,
“hour”:m.group(5) if m.group(5) is not None else “00”,
“minute”:m.group(6) if m.group(6) is not None else “00”,
“second”:m.group(7) if m.group(7) is not None else “00”
}
print(“res = “,res)
params = {}
for key in res:
if res[key] is not None:
temp = None
if key == “year”:
pass
else:
temp = cn2dig(res[key][:-1])
if temp is not None:
params[key] = int(temp)
print(“params = “,params)
# 目标时间
today = datetime.today().replace(month=params[“moon”],day=params[“day”],hour=params[“hour”],minute=params[“minute”],second=params[“second”])# 获取指定时间
print(“today = “,today)
hour = today.time().hour
# 获取当前小时
if hour < 12:
today = today.replace(hour=hour+12)
# today.replace():用于用相同的值替换日期和时间
_specificationTime = today.strftime(“%Y-%m-%d %H:%M:%S”)
print(“规范化格式的目标时间:”,specificationTime)

_# 中文数字 —> 阿拉伯数字
_UTIL_CN_NUM = {
“零”:0,”一”:1,”二”:2,”两”:2,”三”:3,”四”:4,”五”:5,”六”:6,”七”:7,”八”:8,”九”:9,
“0”:0,”1”:1,”2”:2,”3”:3,”4”:4,”5”:5,”6”:6,”7”:7,”8”:8,”9”:9
}
UTIL_CN_UNIT = {“十”:10,”百”:100,”千”:1000,”万”:10000,}
def cn2dig(src):
if src == “”:
return None
m = re.match(“\d+”,src)
if m:
return int(m.group(0))
rsl = 0
unit = 1
for item in src[::-1]:
if item in UTIL_CN_UNIT.keys():
unit = UTIL_CN_UNIT[item]
elif item in UTIL_CN_NUM.keys():
num = UTIL_CN_NUM[item]
rsl += num*unit
else:
return None
if rsl < unit:
rsl += unit
return rsl`

运行和结果:

text = "黄淮学院于后天下午两点放假。"<br />print("当前时间:",datetime.today().strftime("%Y年%m月%d日"))<br />time_res = time_extract(text)<br />print("time_res = ",time_res)<br />parse_datetime(time_res[0])
image.png