用正则表达式过滤数据列表的python方法?

2024-09-29 23:31:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表,我想用正则表达式过滤。我有了一个解决方案的开端:

lines = ['Some data', 'Data of interest', 'Some data', 'Data of Interest', 'Some data', 'Data of interest']
r = re.compile(r'.*[iI]nterest.*')
relevant_lines = [r.findall(line) for line in lines]
print(relevant_lines)

…这几乎奏效了:

^{pr2}$

…但是有没有办法只使用匹配的行而不使用嵌套列表填充结果列表?在

编辑-有没有比下面更干净的方法?

[r[0] for r in [r.findall(line) for line in lines] if len(r) > 0]

Tags: of字符串in列表fordatalinesome
2条回答
relevant_lines = [m.group(0) for m in map(r.match, lines) if m is not None]

以下是控制台中的结果:

^{pr2}$

事情并不复杂。将函数式编程与生成器结合起来是非常好的。在

只需使用普通循环,并非所有内容都适合列表比较:

r = re.compile(r'.*[iI]nterest.*')
relevant_lines = []
for line in lines:
    mtch = r.match(line)
    if mtch:
        relevant_lines.append(mtch.group())

如果使用的是列表比较,则生成表达式并过滤空列表会更好:

^{pr2}$

或者用match过滤:

[x.group() for x in filter(None,(r.match(line) for line in lines))]

对于python2,使用itertools.ifilter。在

或者,对于使用python2切换itertools.imap的映射和{}的过滤器的功能更强大的方法:

[x.group() for x in filter(None, map(r.match, lines))]

可以使用内部循环的生成器表达式重写您自己的列表组件:

[r[0] for r in (r.findall(line) for line in lines) if r]

如果您不需要列表,请使用生成器表达式并对其进行迭代。在

相关问题 更多 >

    热门问题