当前位置: 首页 > 工具软件 > PyUnit > 使用案例 >

修改pyunit_time使得其支持‘xx~xx月’的时间文本

百里文景
2023-12-01

因为需要使用时间文本转换为标准时间的功能,考察多种第三方包后选择了pyunit_time,但是还是有很多不尽人意的地方,所以把整个包拷出来,自己修改以满足需求。

今天发现pyunit_time不支持‘xx~xx月’的表述,例如“6~9月”只会识别出9月,但是“6月~9月”是可以识别出“6月”和“9月”,因此将“6~9月”转成“6月~9月”就可以了,其实本质上也是个时间单位省略的问题。

下面是原始代码(所在文件是/pyunit_time/filters.py):

def get_time_key(string) -> list:
    """根据字符串提取字符串中的时间关键词

    比例: 国庆节的前一天晚上8点半
    返回: ['国庆节', '前一天晚上8点半']

    :param string: 关于口述话的时间字符串
    :return: 时间关键词
    """
    keys, start, end = [], -1, -1
    match = pattern.finditer(string)

    for key in match:
        start = key.start()
        if start == end:
            keys[-1] += key.group()
        else:
            keys.append(key.group())
        end = key.end()
    return keys

它采用的是正则匹配的方式,pattern调用了之前准备好正则表达式,像“x年”、‘x月’等,单独的数字匹配不上任何一个,所以会被忽略。

修改后:

def get_time_key(string) -> list:
    """根据字符串提取字符串中的时间关键词

    比例: 国庆节的前一天晚上8点半
    返回: ['国庆节', '前一天晚上8点半']

    :param string: 关于口述话的时间字符串
    :return: 时间关键词
    """
    if '~' in string:  # lyc修改点,支持“xx~xx月”的表述
        begin, *middle, finish = string.split('~')
        if begin and finish and begin[-1].isdigit() and not finish[-1].isdigit():
            string = string.replace('~', finish[-1] + '~')

    keys, start, end = [], -1, -1
    match = pattern.finditer(string)

    for key in match:
        start = key.start()
        if start == end:
            keys[-1] += key.group()
        else:
            keys.append(key.group())
        end = key.end()
    return keys

在原始处理之前将最后一个时间单位补充到“~”之前的单独的数字后,完成了转换,再测试就发现可以识别“6~9月”了。

 类似资料: