如果字符串中包含未知格式和其他文本的日期,我该如何将它们分开?
>>dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
datetime.datetime(2010, 7, 10, 0, 0)
来自Extracting date from a string in Python的是朝着正确方向迈出的一步,但我想要的是非日期文本,例如:
date = 2010-07-10
str_a = 'monkey', str_b = 'love banana'
如果日期字符串中没有空格,我可以拆分字符串并测试每个子字符串,但'monkey Feb 20, 2015 loves 2014 bananas'
怎么样? 2014
和2015
都会“传递”parse(),但只有其中一个是日期的一部分。
编辑:似乎没有任何合理的方式来处理'monkey Feb 20, 2015 loves 2014 bananas'
因为事情解析()可以处理'monkey Feb 20, 2015 loves bananas'
或'monkey 2/20/2015 loves bananas'
或'monkey 20 Feb 2015 loves 2014 bananas'
或其他变体用。
答案 0 :(得分:1)
您可以使用正则表达式来提取单词,并且为了获取月份名称,您可以检查您的字符串不在calendar.month_abbr
和calendar.month_name
中:
>>> import clalendar
>>> def word_find(s):
... return [i for i in re.findall(r'[a-zA-Z]+',s) if i.capitalize() not in calendar.month_name and i.capitalize() not in calendar.month_abbr]
演示:
>>> s1='monkey Feb 20, 2015 loves 2014 bananas'
>>> s2='monkey Feb 20, 2015 loves bananas'
>>> s3='monkey 2/20/2015 loves bananas'
>>> s4='monkey 20 Feb 2015 loves 2014 bananas'
>>> print word_find(s1)
['monkey', 'loves', 'bananas']
>>> print word_find(s2)
['monkey', 'loves', 'bananas']
>>> print word_find(s3)
['monkey', 'loves', 'bananas']
>>> print word_find(s4)
['monkey', 'loves', 'bananas']
和此:
>>> s5='monkey 20 January 2015 loves 2014 bananas'
>>> print word_find(s5)
['monkey', 'loves', 'bananas']
答案 1 :(得分:0)
在自然语言文本中查找日期/时间并在输入文本中返回其位置,从而允许获取非日期文本:
#!/usr/bin/env python
import parsedatetime # $ pip install parsedatetime
cal = parsedatetime.Calendar()
for text in ['monkey 2010-07-10 love banana',
'monkey Feb 20, 2015 loves 2014 bananas']:
indices = [0]
for parsed_datetime, type, start, end, matched_text in cal.nlp(text) or []:
indices.extend((start, end))
print([parsed_datetime, matched_text])
indices.append(len(text))
print([text[i:j] for i, j in zip(indices[::2], indices[1::2])])
[datetime.datetime(2015, 2, 21, 20, 10), '2010']
['monkey ', '-07-10 love banana']
[datetime.datetime(2015, 2, 20, 0, 0), ' Feb 20, 2015']
[datetime.datetime(2015, 2, 21, 20, 14), '2014']
['monkey', ' loves ', ' bananas']
注意:parsedatetime
无法将2010-07-10
识别为第一个字符串中的日期。 2010
和2014
被识别为两个字符串中的时间(20:10
和20:14
)。