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

Best regex to match IEEE Time Stamp format in Python

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

我有一个 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

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

编辑

我误解了捕获组在 python 的 re 模块中的工作方式——语句中只有一组括号,所以 re 模块返回了最近抓取的捕获组——“58 -".

我最终采用的方法是引用 group(0),正如 Dawg 在下面所建议的那样。

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

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

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

(\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']

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

如果你想要一个匹配对象中的时间戳,我认为这应该可行

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

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

此外,match.groups 实际上 returns 组对象的数量,您应该尝试 .group() 代替(您的代码仍然无法正常工作,因为您将 5 组数字分组在和最后的 -58 将被省略

我会在下面使用:

_(\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

你可能想要

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']