使用正则表达式如何删除字符串中的日期,时间?

时间:2019-02-28 08:25:38

标签: python regex python-3.x pandas dataframe

具有一个df值

      0                                             |    1
 Thanks $.728.98 in nyc on 2018-04-22:11:09:35      |   7812

 Rs.999.98 in shop 1872 mumbai on 2018-04-22        |   8574
 INR.999.98 in shop 1872 mumbai on 2018-04          |   79821
 Thanks $.4728.98 in nyc on 2018-04-22 sat 11:09:35 |   7818

使用正则表达式如何删除日期格式不同的字符串中的这些日期

输出应为

3 个答案:

答案 0 :(得分:0)

如果您的日期是一致的,并且在最后一个“开”字之后,您可以尝试使用以下代码对其进行解析:

import re
from datetime import datetime

from dateutil.parser import parse
import unittest

def parse_custom_string(mystr):
    return mystr.split(mystr.split(sep="on")[-1])[0][:-3]

def parse_date_custom_string(mystr):
    return parse(timestr=(mystr.split(mystr.split(sep="on")[-2])[1]), dayfirst=False,fuzzy_with_tokens=True)[0]

assert (parse_custom_string('Thanks $.728.98 in nyc on 2018-04-22:11:09:35')  == "Thanks $.728.98 in nyc" )
assert (type(parse_date_custom_string('Thanks $.728.98 in nyc on 2018-04-22:11:09:35')) == datetime)


assert (parse_custom_string('Rs.999.98 in shop 1872 mumbai on 2018-04-22')  == "Rs.999.98 in shop 1872 mumbai" )
assert (type(parse_date_custom_string('Rs.999.98 in shop 1872 mumbai on 2018-04-22')) == datetime)

assert (parse_custom_string('INR.999.98 in shop 1872 mumbai on 2018-04')  == "INR.999.98 in shop 1872 mumbai" )
assert (type(parse_date_custom_string('INR.999.98 in shop 1872 mumbai on 2018-04')) == datetime)

assert (parse_custom_string('Thanks $.4728.98 in nyc on 2018-04-22 sat 11:09:35')  == "Thanks $.4728.98 in nyc" )
assert (type(parse_date_custom_string('Thanks $.4728.98 in nyc on 2018-04-22 sat 11:09:35')) == datetime)

答案 1 :(得分:0)

与此匹配的正则表达式将是一个非常难以理解的糟糕解决方案。

在您的情况下,在任何日期之前都可以使用“ on”关键字,因此,只要日期表达式中没有空格(在此日期之后也删除所有字符),它就可以在此处使用。但也可以替换其他表达式,例如on 1234on !@$#

df[0].str.replace('on\s+[\W\d]+', '')

所以输出是:

              0                              1
0   Thanks $.728.98 in nyc                   1
1                                           7812
2   Rs.999.98 in shop 1872 mumbai           8574
3   INR.999.98 in shop 1872 mumbai          79821
4   Thanks $.4728.98 in nyc sat 11:09:35    7818

没有正则表达式的其他解决方案是删除关键字“ on”之后的所有内容:

df[0] = df[0].apply(lambda x: x.split("on")[0])

结果:

0                                    1
0   Thanks $.728.98 in nyc           1
1                                   7812
2   Rs.999.98 in shop 1872 mumbai   8574
3   INR.999.98 in shop 1872 mumbai  79821
4   Thanks $.4728.98 in nyc         7818

答案 2 :(得分:0)

要将日期替换为空格,请使用此正则表达式on\s[\d\w-:\s]*Here is the demo