我做了一些搜索,但没有找到具体的,我相信这将是一个快速的答案。
我有一个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
答案 0 :(得分:1)
您需要一个或多个捕获组:
(\d\d\d\d-\d\d-\d\d-\d\d-\d\d-\d\d)
或者,使用嵌套捕获组:
>>> 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)
答案 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']