我正在尝试从包含以下行的文本文件中解析数据:
On 1-1-16 1:48 Bob used: 187
On 1-5-16 2:50 Bob used: 2
我想只打印时间和使用的数字,所以它看起来像:
1-1-16, 1:48, 187
1-5-16, 2:50, 2
我正在使用这个正则表达式:
print(re.search(r"On ([0-9,-, ]+)Bob used ([0-9\.]+)", line.strip()))
我得到的结果是< _sre.SRE_Match对象; span =(23,26),match ='Bob used used:187'>
我尝试使用.group()但是它给出错误“'NoneType'对象没有属性'group'”我也注意到它只发现第二个分组(数字)而不是第一个(日期和时间)
如何解决这个问题?
答案 0 :(得分:1)
您错过了:
之后的Bob used
,您需要更准确地表达日期部分 - 例如,\d+-\d+-\d+ \d+:\d+
:
>>> s = 'On 1-1-16 1:48 Bob used: 187 On 1-5-16 2:50 Bob used: 2'
>>> re.search(r"On (\d+-\d+-\d+ \d+:\d+) Bob used: ([0-9\.]+)", s).groups()
('1-1-16 1:48', '187')
答案 1 :(得分:1)
您没有提供有关如何使用它的足够信息,但由于您收到了Match
个对象,因此当您致电{{1}时,该对象不应为None
除非你没有将结果存储到正确的位置。很可能你正在处理许多行,其中一些行匹配,而另一些则不匹配,并且在访问组之前你没有检查你是否匹配。
在进一步使用之前,您的代码应始终验证它是否为.group()
;确保您的测试结构如下:
Match
答案 2 :(得分:1)
我自己对正则表达式很陌生,但我想出了这个
import re
source = "On 1-1-16 1:48 Bob used: 187\nOn 1-5-16 2:50 Bob used: 2"
x=re.finditer('([0-9]-)+[0-9]+',source)
y=re.finditer('[0-9]+:[0-9]+',source)
z=re.finditer(': [0-9]*',source)
L = []
for i,j,k in zip(x,y,z):
L.append((i.group(), j.group(), k.group().replace(': ', '') ))
print(L)
输出
[('1-1-16', '1:48', '187'), ('1-5-16', '2:50', '2')]