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

最も簡単な方法は、グロブの結果を自分でフィルタリングすることです。単純なループ内包表記を使用してこれを行う方法は次のとおりです。

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

正規表現を使用することもできますが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

(ちなみに、Python型listなので、変数に名前を付けるのはお勧めできません...)list

于 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())

これは、リスト、タプル、dict(すべてのキーが文字列の場合)などの文字列を返すすべてのイテレータを受け入れます。部分一致をサポートする場合は、に変更でき.matchます.search。これは明らかにジェネレーターを返すことに注意してください。したがって、結果を反復処理せずに使用する場合は、結果を自分でリストに変換するか、returnステートメントをlist(...)でラップできます。

于 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 に答える