Python 如何知道一个完整的句子中是否有日期?

Python 如何知道一个完整的句子中是否有日期?,python,parsing,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

我看过一些帖子,涉及识别一个可能的字符串是否是日期,但似乎没有一个帖子涉及一个句子是否可能包含日期

我使用了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

一种解决方案是拆分字符串,然后测试每个部分,如果任何拆分的字符串成功解析为日期,则返回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  

一种解决方案是拆分字符串,然后测试每个部分,如果任何拆分的字符串成功解析为日期,则返回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  

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

重新导入
def是_日期(regex,str):
返回布尔值(重新匹配(正则表达式,s))
regex=r'.*\d{4}-\d\d?-\d\d?*?'
>>>is_date(regex,“foo-bar”)
假的
>>>is_日期(regex,“1990-12-1”)
真的
>>>is_日期(regex,“foo 1990-12-1 bar”)
真的
这将匹配格式为“#####-#[#]-#[#]]的任何日期,其中方括号中的#是可选的。您可以修改此正则表达式模式以满足您的需要


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

重新导入
def是_日期(regex,str):
返回布尔值(重新匹配(正则表达式,s))
regex=r'.*\d{4}-\d\d?-\d\d?*?'
>>>is_date(regex,“foo-bar”)
假的
>>>is_日期(regex,“1990-12-1”)
真的
>>>is_日期(regex,“foo 1990-12-1 bar”)
真的
这将匹配格式为“#####-#[#]-#[#]]的任何日期,其中方括号中的#是可选的。您可以修改此正则表达式模式以满足您的需要


一种可能是检查原始字符串的所有可能(连续)子字符串。该解决方案具有糟糕的性能(N^2次调用OP的
is_date
),但它不依赖启发式来分割字符串或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

一种可能是检查原始字符串的所有可能(连续)子字符串。该解决方案具有糟糕的性能(N^2次调用OP的
is_date
),但它不依赖启发式来分割字符串或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