检查字符串中是否包含日期或时间戳(Python)

6 投票
2 回答
15005 浏览
提问于 2025-04-18 06:29

我需要写一个函数,这个函数要接受一个字符串,然后完成以下几件事:

  1. 检查这个字符串是否是UTC格式的时间戳(比如说,它的格式是 2014-05-10T12:30:00)。
  2. 如果是上面提到的格式,就把'T'替换成空格,然后返回这个字符串。
  3. 如果不是时间戳,就直接返回这个字符串。

在Python中,最好的实现方法是什么呢?我想我可以用datetime模块。但这能用re模块来完成吗?

2 个回答

6

虽然zmo的回答是对的,但我发现很多人,尤其是经验丰富的系统管理员,他们在使用正则表达式方面非常出色,但常常会自己编写正则表达式。其实,正则表达式不容易维护,也不容易阅读。而Python本身的标准库提供了一些很棒的方法,可以让我们在不需要重新发明正则表达式的情况下,轻松完成任务。以下是我个人的建议,比较符合Python风格的解决方案:

In[87]: import time

In[88]: correct = "2014-05-10T12:30:00"
In[89]: wrong = "some string" # will raise ValueError

In[90]: try:
           time.strptime(correct, "%Y-%m-%dT%H:%M:%S")
           correct = correct.replace('T',' ')
        except ValueError:
           pass
        .... 

In [91]: correct
Out[91]: '2014-05-10 12:30:00'

In [93]: wrong = "foo bar baz"

In [94]: try:                 
            time.strptime(wrong, "%Y-%m-%dT%H:%M:%S")
            correct = correct.replace('T',' ')
         except ValueError:
            pass
        .... 

In [95]: wrong
Out[95]: 'foo bar baz'
3

你可以使用正则表达式来匹配:

>>> s1 = "1) check if it is a timestamp in UTC format (e.g. if it is of the form '2014-05-10T12:30:00')."
>>> s2 = "3) If it is not of timestamp, simply return the string."
>>> re.compile('\d\d\d\d-\d\d-\d\d\(T\)\d\d:\d\d:\d\d')
<_sre.SRE_Pattern object at 0x7f9781558470>
>>> s = re.sub(r'(.*\d\d\d\d-\d\d-\d\d)T(\d\d:\d\d:\d\d.*)',r'\1 \2',s1)
>>> print(s)
1) check if it is a timestamp in UTC format (e.g. if it is of the form '2014-05-10 12:30:00').
>>> s = re.sub(r'(.*\d\d\d\d-\d\d-\d\d)T(\d\d:\d\d:\d\d.*)',r'\1 \2',s2)
>>> print(s)
3) If it is not of timestamp, simply return the string.
>>> 

正则表达式可视化

试试这个

这里的关键是要抓住在T字符左右的部分,然后把它们再放到一个空格的两边。作为额外的好处,如果没有匹配到,就不会进行替换。

撰写回答