【问题标题】:Date time matching using regex使用正则表达式匹配日期时间
【发布时间】:2017-05-15 02:51:44
【问题描述】:

我有日期时间字符串 t1

'Sat 02 May 2015 19:54:36 +0530'

我想提取删除第一个和最后一个单词,即 Sat 和 +0530。这是我写的三个正则表达式的行为:

(1) re.search(r'(\d{2})([^:]+)([:\d{2}]+)',t1) matches '02 May 2015 19:54:36'
(2) re.search(r'(\d{2})([^:]+)([:\d{2}]{2})',t1) matches '02 May 2015 19:5'
(3) re.search(r'(\d{2})(.+)([\:\d{2}])',t1) matches '02 May 2015 19:54:36 +0530'

有人能解释一下 2 号和 3 号有什么问题吗?我认为所有这些都应该产生相同的结果。

【问题讨论】:

  • 为什么不直接将其解析为 Date 对象,然后格式化 Date 对象?
  • @J.N.你能给我举个例子吗?我是 Python 新手。谢谢。
  • 假设您使用的是 Python 2:以下是如何将字符串解析为 DateTime 对象:stackoverflow.com/questions/466345/… 以下是如何格式化 DateTime 对象:docs.python.org/2/library/datetime.html 解析表示的日期和时间到 DateTime 对象比创建相对脆弱的正则表达式要容易得多。
  • @J.N.谢谢。

标签: python regex string datetime


【解决方案1】:

有人能解释一下 2 号和 3 号有什么问题吗?

您的正则表达式(\d{2})([^:]+)([:\d{2}]{2}) 中的问题是您在第三组中使用字符类,即([:\d{2}]{2}),这意味着它将匹配这些字符中的任何一个:digits{2、@987654328 @两次。因此它匹配:5 并停止。第三个也是一样。

您的第一个正则表达式(\d{2})([^:]+)([:\d{2}]+),因为您使用了+(多个)量词,它消耗:54:36,因为它们属于字符类[:\d{2}]

删除字符类,您的第二个正则表达式将是 (\d{2})([^:]+)(:\d{2}){2},它可以正常工作。

Regex101 Demo

【讨论】:

  • 谢谢。好像我暂时忘记了 [] 的目的:)。
【解决方案2】:

您的问题的标题与正则表达式有关,但您的问题似乎实际上是关于如何从日期字符串中删除第一个和最后一个单词。就您而言,我个人不会使用正则表达式。相反,您可以简单地将字符串拆分为空格,然后加入结果列表,省略第一个和最后一个元素:

In [1]: s = 'Sat 02 May 2015 19:54:36 +0530'

In [2]: ' '.join(s.split(' ')[1:-1])
Out[2]: '02 May 2015 19:54:36'

[1:-1] 将为您提供从第二个元素到(但不包括)最后一个元素的序列的所有元素(在本例中为由 split() 创建的字符串列表)。

正则表达式不是解决您问题的“错误”方法,而我的方法也不是“正确”的。但是,我发现,在适用的情况下,字符串方法通常更适合这种工作,更容易阅读,并且不易出错。至少这是我的经验。

【讨论】:

  • 谢谢。我只是想用正则表达式来解决这个问题。
  • @Sumit 明白了!我只是想把它放在那里以防万一它对你有用。我记得当我第一次学习正则表达式时,我对它们的力量感到敬畏,并希望将它们用于所有事情。就我而言,我花了一段时间才知道还有其他方法可以做事,哈哈!
  • 这很有趣。同意,正则表达式非常强大。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 2012-04-16
  • 2012-04-16
  • 2018-12-25
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多