Python glob和括号字符('[]')

pro*_*eek 26 python glob

/ Users/smcho/Desktop/bracket/[10,20]目录有"abc.txt",但是当我运行这个Python代码时

import glob
import os.path

path1 = "/Users/smcho/Desktop/bracket/\[10,20\]"
pathName = os.path.join(path1, "*.txt")
print glob.glob(pathName)
Run Code Online (Sandbox Code Playgroud)

它返回一个空列表.

  • Python的glob不能处理括号字母或其他字母吗?
  • 有什么方法可以解决这个问题吗?

int*_*jay 25

括号in glob用于字符类(例如,[a-z]将匹配小写字母).您可以将每个括号放在一个字符类中以强制它们匹配:

path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"
Run Code Online (Sandbox Code Playgroud)

[[]是仅包含字符的字符类[,并且[]]是仅包含字符]的字符类(通过将其放在第一个位置,可以将结束括号放在字符类中).

此外,由于括号不会在字符串文字中转义,因此您的代码将查找反斜杠和括号.

  • 执行此更改的快速正则表达式:`ptn = re.sub('([\[\]])','[\\1]',ptn)` (3认同)
  • @~unutbu:不,`[[10,20]]`会查找`[102,`后跟`]`中的一个字符.我不只是将括号加倍,而是创建了一个字符类:`[[]`是一个只包含字符`[`的字符类. (2认同)

Tit*_*ion 9

在Python 3.4中,您可以使用glob.escape


小智 6

您可以使用正确path.replace('[', '[[]')处理任意输入路径glob


jfs*_*jfs 5

globfnmatch在引擎盖下使用.您可以直接使用它:

import fnmatch, os

names = os.listdir("/Users/smcho/Desktop/bracket/[10,20]")
print fnmatch.filter(names, '*.txt')
Run Code Online (Sandbox Code Playgroud)

或者使用(非公开)glob.glob1()(它至少在Python 2.3+中出现,包括Python 3):

import glob

print glob.glob1("/Users/smcho/Desktop/bracket/[10,20]", '*.txt')
Run Code Online (Sandbox Code Playgroud)

这是实施glob.glob1:

def glob1(dirname, pattern):
    if not dirname:
        dirname = os.curdir
    if isinstance(pattern, unicode) and not isinstance(dirname, unicode):
        dirname = unicode(dirname, sys.getfilesystemencoding() or
                                   sys.getdefaultencoding())
    try:
        names = os.listdir(dirname)
    except os.error:
        return []
    if pattern[0] != '.':
        names = filter(lambda x: x[0] != '.', names)
    return fnmatch.filter(names, pattern)
Run Code Online (Sandbox Code Playgroud)