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

7 篇文章 0 订阅

因为需要使用时间文本转换为标准时间的功能,考察多种第三方包后选择了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月”了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值