在python的列表中查找字符串

时间:2014-11-26 11:16:58

标签: python regex

我有一个嵌套列表如下:

[['asgy200;f','ssll100','   time is: 10h:00m:12s','xxxxxxx','***','','asgy200;f','frl5100','   time is: 00h:00m:05s','ooo']]

'***'是我的分隔符。我想在python中列出列表中的所有秒。 首先使用正则表达式,我想将具有time is:字符串的行分开,但它不起作用!

我不知道该怎么做。

由于

4 个答案:

答案 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
>>> 

allany是两个有用的内置词......

事情就是这样,较慢的循环在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