Проблема с glob, если имя папки содержит [[duplicate]

var str = 'sample string';
[].map.call(str, function(x) {
  return x;
}).reverse().join('');

OR

var str = 'sample string';
console.log(str.split('').reverse().join(''));

// Выход: 'gnirts elpmas'

17
задан Peter Mortensen 29 December 2010 в 11:20
поделиться

4 ответа

Скобки в glob используются для классов символов (например, [a-z] будут соответствовать строчным буквам). Вы можете поместить каждую скобку в класс символов, чтобы они были сопоставлены:

path1 = "/Users/smcho/Desktop/bracket/[[]10,20[]]"

[[] - это класс символов, содержащий только символ [, а []] - это класс символов, содержащий только символ ] (закрывающая скобка может быть помещена в класс символов, поместив ее в первую позицию).

Кроме того, поскольку скобки не экранированы в строковых литералах, ваш код будет искать обратная косая черта, а также скобка.

16
ответ дан interjay 20 August 2018 в 09:20
поделиться
  • 1
    @Roger: Спасибо, я исправил это. – interjay 7 April 2010 в 20:17
  • 2
    @ ~ unutbu: Нет, [[10,20]] будет искать один из символов в [102,, а затем ]. Я не просто удвоил скобки, а создал класс символов: [[] - это класс символов, содержащий только символ [. – interjay 7 April 2010 в 20:19
  • 3
    О да. Ты прав. Спасибо за объяснение. – unutbu 7 April 2010 в 20:22

glob использует fnmatch под капотом. Вы можете использовать его напрямую:

import fnmatch, os

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

Или используя (непубличный) glob.glob1() (он присутствует, по крайней мере, в Python 2.3+, включая Python 3):

import glob

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

Вот реализация 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)
5
ответ дан jfs 20 August 2018 в 09:20
поделиться

В Python 3.4 вы можете использовать glob.escape .

4
ответ дан Piotr Kowalski 20 August 2018 в 09:20
поделиться
  • 1
    так делает glob.glob (glob.escape (pathName)) ?! Я все еще получаю пустой список – fricadelle 19 May 2018 в 08:30
  • 2
    то ваш pathName просто ошибается. если это относительный путь, дважды проверьте, что ваш рабочий каталог тот, который вы считаете: os.getcwd() – Piotr Kowalski 19 May 2018 в 08:51

Вы можете использовать path.replace('[', '[[]') для правильного ввода произвольных путей ввода с помощью glob.

2
ответ дан vmz 20 August 2018 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: