59
import glob

list = glob.glob(r'*abc*.txt') + glob.glob(r'*123*.txt') + glob.glob(r'*a1b*.txt')

for i in list:
  print i

此代码用于列出当前文件夹中具有'abc'或其'123'名称的文件'a1b'

我将如何使用一个glob来执行此功能?

4

4 回答 4

92

最简单的方法是自己过滤 glob 结果。以下是使用简单循环理解的方法:

import glob
res = [f for f in glob.glob("*.txt") if "abc" in f or "123" in f or "a1b" in f]
for f in res:
    print f

您也可以使用正则表达式和 no glob

import os
import re
res = [f for f in os.listdir(path) if re.search(r'(abc|123|a1b).*\.txt$', f)]
for f in res:
    print f

(顺便说一句,命名变量list是个坏主意,因为list它是 Python 类型......)

于 2012-10-23T14:07:36.140 回答
27

我很惊讶这里没有使用过滤器的答案。

import os
import re

def glob_re(pattern, strings):
    return filter(re.compile(pattern).match, strings)

filenames = glob_re(r'.*(abc|123|a1b).*\.txt', os.listdir())

这接受任何返回字符串的迭代器,包括列表、元组、字典(如果所有键都是字符串)等。如果要支持部分匹配,可以更改.match.search. 请注意,这显然会返回一个生成器,因此如果您想使用结果而不对其进行迭代,您可以自己将结果转换为列表,或者使用 list(...) 包装 return 语句。

于 2018-07-09T12:57:18.923 回答
16

这是基于其他答案的现成方法。这不是最关键的性能,但它的工作原理与描述的一样;

def reglob(path, exp, invert=False):
    """glob.glob() style searching which uses regex

    :param exp: Regex expression for filename
    :param invert: Invert match to non matching files
    """

    m = re.compile(exp)

    if invert is False:
        res = [f for f in os.listdir(path) if m.search(f)]
    else:
        res = [f for f in os.listdir(path) if not m.search(f)]

    res = map(lambda x: "%s/%s" % ( path, x, ), res)
    return res
于 2013-06-19T17:35:14.387 回答
1
for filename in glob.iglob(path_to_directory + "*.txt"):
    if filename.find("abc") != -1 or filename.find("123") != -1 or filename.find("a1b") != -1:
        print filename
于 2017-11-24T15:21:28.767 回答