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

6

我需要编写一个函数,它将接收一个字符串并执行以下操作:

  1. 检查它是否为UTC格式的时间戳(例如,如果它是形如2014-05-10T12:30:00的格式)。
  2. 如果它符合上述格式,则将'T'替换为空格并返回该字符串。
  3. 如果它不是时间戳,则简单地返回该字符串。

在Python中实现这个功能最好的方法是什么?我想我可以使用datetime模块。但是能否使用re模块完成?


1
对不起,我替你完成了作业。虽然我很享受使用正则表达式解决简单问题的乐趣,但这并不能真正帮助你思考自己的问题。下次请带上你实际尝试编写的代码,否则你将永远无法学到东西。 - zmo
2个回答

6

虽然zmo的答案是正确的,但我看到很多人,特别是经验丰富的系统管理员,在处理正则表达式时太过于自信,总是试图编写自己的正则表达式。 正则表达式很难维护和阅读,而Python自带的STL提供了一些很好的经过验证的方法,不需要重新发明正确的正则表达式。 这是我的两分钱,Pythonic的解决方案:

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 字符左右的分组,然后将它们再次粘贴在空格周围。作为奖励,如果没有匹配,则不进行替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接