从字符串中删除识别的日期
remove recognized date from string
作为输入,我有几个包含不同格式日期的字符串,例如
- "Peter drinks tea at 16:45"
- "My birthday is on 08-07-1990"
- "On Sat 11 July I'll be back home"
我使用 dateutil.parser.parse
来识别字符串中的日期。
在下一步中,我想从字符串中删除日期。结果应该是
- "Peter drinks tea at "
- "My birthday is on "
- "On I'll be back home"
有没有简单的方法可以做到这一点?
您可以使用 re.findall() 方法查找日期,然后将其从您的字符串中拆分出来。
我认为下面link中的代码可以解决您的问题。
如果您定义一个函数来验证字符串是否为日期,我们可以在一行中完成此操作
from dateutil import parser
data = ['Peter drinks tea at 16:45', 'My birthday is on 08-07-1990', "On Sat 11 July I'll be back home"]
def is_valid_date(date_str):
try:
parser.parse(date_str)
return True
except:
return False
new_list = [' '.join([w for w in line.split() if not is_valid_date(w)]) for line in data]
print(new_list)
# ['Peter drinks tea at', 'My birthday is on', "On I'll be back home"]
您可以使用 fuzzy_with_tokens
选项 dateutil.parser.parse
:
from dateutil.parser import parse
dtstrs = [
"Peter drinks tea at 16:45",
"My birthday is on 08-07-1990",
"On Sat 11 July I'll be back home",
]
out = [
parse(dtstr, fuzzy_with_tokens=True)
for dtstr in dtstrs
]
结果:
[(datetime.datetime(2018, 7, 17, 16, 45), ('Peter drinks tea at ',)),
(datetime.datetime(1990, 8, 7, 0, 0), ('My birthday is on ',)),
(datetime.datetime(2018, 7, 11, 0, 0), ('On ', ' ', " I'll be back home"))]
当 fuzzy_with_tokens
为真时,解析器 returns 一个 datetime
的元组和一个忽略标记的元组(已使用的标记被删除)。您可以像这样将它们重新组合成一个字符串:
>>> ['<missing>'.join(x[1]) for x in out]
['Peter drinks tea at ',
'My birthday is on ',
"On <missing> <missing> I'll be back home"]
我会注意到模糊解析逻辑并不是非常可靠,因为很难从字符串中只挑选出有效的组件并使用它们。如果把喝茶的人改成叫April的,比如:
>>> dt, tokens = parse("April drinks tea at 16:45", fuzzy_with_tokens=True)
>>> print(dt)
2018-04-17 16:45:00
>>> print('<missing>'.join(tokens))
drinks tea at
所以我强烈建议大家谨慎使用这种方法(尽管我不能真正推荐 更好的 方法,这只是一个难题)。
def remove_dates(sentence):
"""remove the dates like Mar 30 2013"""
sentence = re.sub('(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{2}\s\d{4}', ' ', sentence)
return sentence
测试:
remove_dates(' good Mar 30 2013 day')
'美好的一天'
作为输入,我有几个包含不同格式日期的字符串,例如
- "Peter drinks tea at 16:45"
- "My birthday is on 08-07-1990"
- "On Sat 11 July I'll be back home"
我使用 dateutil.parser.parse
来识别字符串中的日期。
在下一步中,我想从字符串中删除日期。结果应该是
- "Peter drinks tea at "
- "My birthday is on "
- "On I'll be back home"
有没有简单的方法可以做到这一点?
您可以使用 re.findall() 方法查找日期,然后将其从您的字符串中拆分出来。 我认为下面link中的代码可以解决您的问题。
如果您定义一个函数来验证字符串是否为日期,我们可以在一行中完成此操作
from dateutil import parser
data = ['Peter drinks tea at 16:45', 'My birthday is on 08-07-1990', "On Sat 11 July I'll be back home"]
def is_valid_date(date_str):
try:
parser.parse(date_str)
return True
except:
return False
new_list = [' '.join([w for w in line.split() if not is_valid_date(w)]) for line in data]
print(new_list)
# ['Peter drinks tea at', 'My birthday is on', "On I'll be back home"]
您可以使用 fuzzy_with_tokens
选项 dateutil.parser.parse
:
from dateutil.parser import parse
dtstrs = [
"Peter drinks tea at 16:45",
"My birthday is on 08-07-1990",
"On Sat 11 July I'll be back home",
]
out = [
parse(dtstr, fuzzy_with_tokens=True)
for dtstr in dtstrs
]
结果:
[(datetime.datetime(2018, 7, 17, 16, 45), ('Peter drinks tea at ',)),
(datetime.datetime(1990, 8, 7, 0, 0), ('My birthday is on ',)),
(datetime.datetime(2018, 7, 11, 0, 0), ('On ', ' ', " I'll be back home"))]
当 fuzzy_with_tokens
为真时,解析器 returns 一个 datetime
的元组和一个忽略标记的元组(已使用的标记被删除)。您可以像这样将它们重新组合成一个字符串:
>>> ['<missing>'.join(x[1]) for x in out]
['Peter drinks tea at ',
'My birthday is on ',
"On <missing> <missing> I'll be back home"]
我会注意到模糊解析逻辑并不是非常可靠,因为很难从字符串中只挑选出有效的组件并使用它们。如果把喝茶的人改成叫April的,比如:
>>> dt, tokens = parse("April drinks tea at 16:45", fuzzy_with_tokens=True)
>>> print(dt)
2018-04-17 16:45:00
>>> print('<missing>'.join(tokens))
drinks tea at
所以我强烈建议大家谨慎使用这种方法(尽管我不能真正推荐 更好的 方法,这只是一个难题)。
def remove_dates(sentence):
"""remove the dates like Mar 30 2013"""
sentence = re.sub('(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{2}\s\d{4}', ' ', sentence)
return sentence
测试:
remove_dates(' good Mar 30 2013 day')
'美好的一天'