当前位置:  开发笔记 > 编程语言 > 正文

在列表中通过正则表达式过滤字符串

如何解决《在列表中通过正则表达式过滤字符串》经验,为你挑选了2个好方法。

我想使用正则表达式过滤python中的字符串列表.在以下情况中,仅保留扩展名为".npy"的文件.

代码不起作用:

import re

files = [ '/a/b/c/la_seg_x005_y003.png',
          '/a/b/c/la_seg_x005_y003.npy',
          '/a/b/c/la_seg_x004_y003.png',
          '/a/b/c/la_seg_x004_y003.npy',
          '/a/b/c/la_seg_x003_y003.png',
          '/a/b/c/la_seg_x003_y003.npy', ]

regex = re.compile(r'_x\d+_y\d+\.npy')

selected_files = filter(regex.match, files)
print(selected_files)

同样的正则表达式在Ruby中适用于我:

selected = files.select { |f| f =~ /_x\d+_y\d+\.npy/ }

Python代码有什么问题?



1> Kevin Guan..:
selected_files = filter(regex.match, files)

re.match('regex')等于re.search('^regex')text.startswith('regex')但正则表达式版本.它只检查字符串是否以正则表达式开头.

所以,请re.search()改用:

import re

files = [ '/a/b/c/la_seg_x005_y003.png',
          '/a/b/c/la_seg_x005_y003.npy',
          '/a/b/c/la_seg_x004_y003.png',
          '/a/b/c/la_seg_x004_y003.npy',
          '/a/b/c/la_seg_x003_y003.png',
          '/a/b/c/la_seg_x003_y003.npy', ]

regex = re.compile(r'_x\d+_y\d+\.npy')

selected_files = list(filter(regex.search, files))
# The list call is only required in Python 3, since filter was changed to return a generator
print(selected_files)

输出:

['/a/b/c/la_seg_x005_y003.npy',
 '/a/b/c/la_seg_x004_y003.npy',
 '/a/b/c/la_seg_x003_y003.npy']

如果您只想获取所有.npy文件,只需使用str.endswith():

files = [ '/a/b/c/la_seg_x005_y003.png',
          '/a/b/c/la_seg_x005_y003.npy',
          '/a/b/c/la_seg_x004_y003.png',
          '/a/b/c/la_seg_x004_y003.npy',
          '/a/b/c/la_seg_x003_y003.png',
          '/a/b/c/la_seg_x003_y003.npy', ]


selected_files = list(filter(lambda x: x.endswith('.npy'), files))

print(selected_files)


在Python 3.x中,`filter()`[返回一个生成器](/sf/ask/17360801/),所以你需要将它包装在`list()`中,如果这是你想要的.
我想知道为什么filter()接受re.search()方法,因为后者返回一个MatchObject实例而不是布尔值。在16.8.3中对此进行了解释(http://www.diveintopython.net/functional_programming/filtering_lists.html):如果项匹配并且filter()解释,则search()方法将返回MatchObject。那是真的。否则,“ search()”返回None,这被解释为False。

2> SIslam..:

只需使用search-因为match从字符串的开头到结尾(即整个)开始匹配,并且搜索匹配字符串中的任何位置。

import re

files = [ '/a/b/c/la_seg_x005_y003.png',
          '/a/b/c/la_seg_x005_y003.npy',
          '/a/b/c/la_seg_x004_y003.png',
          '/a/b/c/la_seg_x004_y003.npy',
          '/a/b/c/la_seg_x003_y003.png',
          '/a/b/c/la_seg_x003_y003.npy', ]

regex = re.compile(r'_x\d+_y\d+\.npy')

selected_files = filter(regex.search, files)
print(selected_files)

输出-

['/a/b/c/la_seg_x005_y003.npy', '/a/b/c/la_seg_x004_y003.npy', '/a/b/c/la_seg_x003_y003.npy']

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有