Python 如何知道一个完整的句子中是否有日期?
我看过一些帖子,涉及识别一个可能的字符串是否是日期,但似乎没有一个帖子涉及一个句子是否可能包含日期 我使用了dateutil解析器函数,只有当日期是字符串的唯一组成部分时,它才能有效地识别字符串中的日期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
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定义中的标记:根据定义,它匹配iffis_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定义中的标记:根据定义,它匹配iffis_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