在Python中匹配IEEE时间戳格式的最佳正则表达式

时间:2015-09-15 21:47:43

标签: python regex

我做了一些搜索,但没有找到具体的,我相信这将是一个快速的答案。

我有一个python脚本解析字符串中的IEEE日期和时间戳,但我认为我使用的是python的匹配对象错误。

import re
stir = "foo_2015-07-07-17-58-26.log"
timestamp = re.search("([0-9]+-){5}[0-9]+", stir).groups()
print timestamp

可生产

58-

当我想要获得

2015-07-07-17-58-26

是否有预制的正则表达式可以在这里更好地工作?我是否被劫持了捕获组?为什么groups()元组的长度只有1?

修改

我误解了捕获组在python的re模块中的工作方式 - 语句中只有一组括号,因此re模块返回最近抓取的捕获组 - “58 - ”。

我最终这样做的方式是引用组(0),正如Dawg在下面所建议的那样。

timestamp = re.search("([0-9]+-){5}[0-9]+", stir)

print timestamp.group(0)
2015-07-07-17-58-26

4 个答案:

答案 0 :(得分:1)

您需要一个或多个捕获组:

(\d\d\d\d-\d\d-\d\d-\d\d-\d\d-\d\d)

Demo

或者,使用嵌套捕获组:

>>> re.search(r'(\d{4}(?:-\d{2}){5})', 'foo_2015-07-07-17-58-26.log')
<_sre.SRE_Match object at 0x100b49dc8>
>>> _.group(1)
'2015-07-07-17-58-26'

或者,您可以使用自己的模式,只使用group(0)代替groups()

>>> re.search("([0-9]+-){5}[0-9]+", "foo_2015-07-07-17-58-26.log").group(0)
'2015-07-07-17-58-26'

或者,将findall与其他捕获组(以及另一个非捕获组)一起使用:

>>> re.findall("((?:[0-9]+-){5}[0-9]+)", 'foo_2015-07-07-17-58-26.log')
['2015-07-07-17-58-26']

但是那会找到不属于时间戳的数字。

答案 1 :(得分:0)

如果你想在一个匹配对象中加上时间戳,我认为这应该有效

\d{4}(?:\d{2}){5}

然后使用group()或group(0)

同样,match.groups实际上返回了组对象的数量,你应该尝试.group()(你的代码仍然无法工作,因为你将5组数字分组,最后的-58将被省略< / p>

答案 2 :(得分:0)

我将在下面使用:

_(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}).

_和。标记开始和结束。

import re
r = r'_(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}).'
s = 'some string'
lst = re.findall(s,r)

link

答案 3 :(得分:0)

你可能想要

re.findall(r"([0-9-]+)", stir)


>>> import re
>>> stir = "foo_2015-07-07-17-58-26.log"
>>> re.findall(r"([0-9-]+)", stir)
['2015-07-07-17-58-26']