123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- from typing import List, Optional
- import arrow
- from loguru import logger
- from .helpers.str_common import (
- del_keyword,
- filter_irregular_expression,
- number_translator,
- )
- from .point import TimePoint
- from .result import Result, DeltaType
- from .unit import TimeUnit
- class TimeNormalizer:
- def __init__(self, isPreferFuture=True, pattern=None):
- self.isPreferFuture = isPreferFuture
- if pattern is None:
- from .resource.pattern import pattern
- self.pattern = pattern
- def parse(self, target: str, baseTime: arrow.Arrow = None) -> dict:
- """
- TimeNormalizer的构造方法,baseTime取默认的系统当前时间
- :param baseTime: 基准时间点
- :param target: 待分析字符串
- :return: 时间单元数组
- """
- if baseTime is None:
- baseTime = arrow.now("Asia/Shanghai")
-
- self.isTimeDelta = False
- self.timeDelta = None
- self.target = target
- self.baseTime = baseTime
- return self.extract()
- def pre(self):
- """
- 待匹配字符串的清理空白符和语气助词以及大写数字转化的预处理
- """
- self.target = filter_irregular_expression(self.target)
- self.target = del_keyword(self.target, r"\s+")
- self.target = del_keyword(self.target, "[的]+")
- self.target = number_translator(self.target)
-
- def extract(self) -> dict:
- """返回 TimeUnit[] 时间表达式类型数组
- """
- self.pre()
- startline = -1
- endline = -1
- rpointer = 0
- temp = []
- match = self.pattern.finditer(self.target)
-
-
- for m in match:
-
- startline = m.start()
- if startline == endline:
- rpointer -= 1
- temp[rpointer] = temp[rpointer] + m.group()
- else:
- temp.append(m.group())
-
- endline = m.end()
- rpointer += 1
-
- res: List[TimeUnit] = []
-
- contextTp = TimePoint()
-
-
-
- for i in range(0, rpointer):
-
- res.append(TimeUnit(temp[i], self, contextTp))
- contextTp = res[i].tp
-
- res = self.filter(res)
- if self.isTimeDelta and self.timeDelta:
- return Result.from_timedelta(self.timeDelta)
- if len(res) == 1:
- return Result.from_timestamp(res)
- if len(res) == 2:
- return Result.from_timespan(res)
- return Result.from_invalid()
- def filter(self, tu_arr: List[TimeUnit]):
- """
- 过滤掉无效识别。
- """
- res = []
- for tu in tu_arr:
- if not tu:
- continue
- if tu.time.timestamp != 0:
- res.append(tu)
-
- return res
|