我有日期时间字符串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号的问题吗?我认为所有这些都应该产生相同的结果。
答案 0 :(得分:2)
有人可以解释2号和3号的问题吗?
你的正则表达式(\d{2})([^:]+)([:\d{2}]{2})
中的问题是你在第三组中使用了字符类,即([:\d{2}]{2})
,这意味着它将匹配这些字符中的任何一个:
,digits
,{{ 1}},{
,2
两次。因此它匹配}
并停止。与第三个相同。
您的第一个正则表达式:5
,因为您使用(\d{2})([^:]+)([:\d{2}]+)
(多个)量词消耗+
,因为它们属于字符类:54:36
。
删除你的第二个正则表达式[:\d{2}]
的字符类,它将正常工作。
<强> Regex101 Demo 强>
答案 1 :(得分:1)
您的问题的标题与正则表达式有关,但似乎您的问题实际上是关于如何从日期字符串中删除第一个和最后一个单词。在你的情况下,我个人不会使用正则表达式。相反,您可以简单地将字符串拆分为空格,然后连接结果列表,省略第一个和最后一个元素:
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()
创建的字符串列表),直至(但不包括)最后一个元素。
正则表达式不是解决问题的“错误”方式,而且我的“不对”。但是,我发现,在适用的情况下,字符串方法通常更适合此类工作,更易于阅读,并且不易出错。这至少是我的经历。