如何知道完整句子中是否包含日期?

时间:2019-06-25 15:27:41

标签: python parsing

我看过一些文章,其中涉及辨别一个可能的字符串是否可以是一个日期,但是似乎句子中都没有可能的日期都没有。

我使用了dateutil解析器函数,该函数似乎仅在日期是字符串的唯一组成部分时才有效地识别字符串中的日期。

from dateutil.parser import parse

def is_date(string, fuzzy=False):
    """
    Return whether the string can be interpreted as a date.

    :param string: str, string to check for date
    :param fuzzy: bool, ignore unknown tokens in string if True
    """
    try: 
        parse(string, fuzzy=fuzzy)
        return True

    except ValueError:
        return False

>>> is_date("1990-12-1")
True
>>> is_date("foo 1990-12-1 bar")
False

3 个答案:

答案 0 :(得分:1)

一种解决方案是拆分字符串,然后测试每个部分,如果任何拆分字符串成功解析为日期,则返回True。

def is_date(string, fuzzy=False):
    """
    Return whether the string can be interpreted as a date.

    :param string: str, string to check for date
    :param fuzzy: bool, ignore unknown tokens in string if True
    """
    def parse_date(date_string):
        try: 
            return parse(date_string, fuzzy=fuzzy)
        except ValueError:
            return False

    return any(parse_date(s) for s in string.split())

>>> is_date("1990-12-1")
True

>>> is_date("foo 1990-12-1 bar")
True

>>> is_date("foo 1990-13-1 bar")
False

>>> is_date('Book by appt. for Dec. 31, 2019')
True  # Both 'Dec.' and '2019' successfully parse to a date.

# But be wary of false positives.
>>> is_date('I had 2019 hits on my website today')
True  

答案 1 :(得分:1)

您可以使用简单的正则表达式模式

import re
def is_date(regex, str):
    return bool(re.match(regex, s))

regex = r'.*? \d{4}-\d\d?-\d\d? .*?'

>>> is_date(regex, "foo bar")
False
>>> is_date(regex, "1990-12-1")
True
>>> is_date(regex, "foo 1990-12-1 bar")
True

这将匹配任何格式为“ ####-#[#]-#[#]”的日期,其中方括号中的#是可选的。您可以修改此正则表达式模式以适应您的需求。

more about regex

答案 2 :(得分:0)

一种可能性是检查原始字符串的所有可能(连续)子字符串。该解决方案具有可怕的性能(对OP的is_date进行了N ^ 2次调用),但是它不依赖启发式方法来拆分字符串或regexp定义中的令牌:根据定义,它与iff is_date匹配子字符串。

def get_all_substrings(input_string):
    # From https://stackoverflow.com/questions/22469997/how-to-get-all-the-contiguous-substrings-of-a-string-in-python
    # could be made a generator to save space, but we are not making a performant solution anyway
    length = len(input_string)
    return [input_string[i:j+1] for i in xrange(length) for j in xrange(i,length)]

def contains_date(string):
    for substring in get_all_substrings(string):
        if is_date(substring): return True
    return False