我有一个嵌套列表如下:
[['asgy200;f','ssll100',' time is: 10h:00m:12s','xxxxxxx','***','','asgy200;f','frl5100',' time is: 00h:00m:05s','ooo']]
'***'
是我的分隔符。我想在python中列出列表中的所有秒。
首先使用正则表达式,我想将具有time is:
字符串的行分开,但它不起作用!
我不知道该怎么做。
由于
答案 0 :(得分:1)
您可以使用前瞻性正则表达式(r'(?<=time is\:).*'
):
>>> [i.group(0).split(':')[2] for i in [re.search(r'(?<=time is\:).*',i) for i in l[0]] if i is not None]
['12s', '05s']
您可以将它们转换为int:
>>> [int(j.replace('s','')) for j in sec]
[12, 5]
如果你想要在替换之后不要将它们转换为int的字符串:
>>> [j.replace('s','') for j in sec]
['12', '05']
答案 1 :(得分:1)
import re
x=[['asgy200;f','ssll100','time is: 10h:00m:12s','xxxxxxx','***','','asgy200;f','frl5100','time is: 00h:00m:05s','ooo']]
s=str(x)
print re.findall(r"(?<=time is)\s*:\s*[^']*:(\d+)",s)
输出:['12', '05']
你可以试试这个。
答案 2 :(得分:0)
您也可以使用捕获组。如果秒数完全等于00
>>> lst = [['asgy200;f','ssll100','time is: 10h:00m:12s','xxxxxxx','***','','asgy200;f','frl5100','time is: 00h:00m:05s','ooo']]
>>> [i for i in re.findall(r'time\s+is:\s+\d{2}h:\d{2}m:(\d{2})', ' '.join(lst[0])) if int(i) != 00]
['12', '05']
>>> lst = [['asgy200;f','ssll100','time is: 10h:00m:00s','xxxxxxx','***','','asgy200;f','frl5100','time is: 00h:00m:05s','ooo']]
>>> [i for i in re.findall(r'time\s+is:\s+\d{2}h:\d{2}m:(\d{2})', ' '.join(lst[0])) if int(i) != 00]
['05']
答案 3 :(得分:0)
考虑到您对Q的最后评论,
>>> x = [['asgy200;f','ssll100','time is: 10h:00m:12s','xxxxxxx','***','','asgy200;f','frl5100','time is: 00h:00m:05s','ooo']]
>>> print all([w[-3:-1]!='00' for r in x for w in r if w.startswith('time is: ')])
True
>>>
all
和any
是两个有用的内置词......
事情就是这样,较慢的循环在x的子列表(r
ows)上,是每个w
ow中项目(r
ords)上最快的循环,我们只选取startswith
一个特定字符串的单词,并且我们的迭代是由布尔值组成的,如果所选单词的第3个最后和第2个字符与'00'
不同,则我们为真。最后,如果所有第二个字段与all
不同,则True
会使用iterable并返回'00'
。
HTH,
我们想早点爆发吗?
all_secs_differ_from_0 = True
for row in x:
for word in row:
if word.startswith('time is: ') and word[-3:-1] == '00':
all_secs_differ_from_0 = False
break
if not all_secs_differ_from_0: break