programa pilas paréntesis parentesis llaves funcion corchetes con balanceo balancear balanceados analizador python glob

pilas - Globos de Python y caracteres de corchete(''[]'')



programa analizador de parentesis llaves y corchetes java (4)

En Python 3.4 puedes usar glob.escape .

El directorio / Users / smcho / Desktop / bracket / [10,20] tiene "abc.txt", pero cuando ejecuto este código Python

import glob import os.path path1 = "/Users/smcho/Desktop/bracket//[10,20/]" pathName = os.path.join(path1, "*.txt") print glob.glob(pathName)

Devuelve una lista vacía.

  • ¿No puede el globo de Python manejar las letras del soporte u otros?
  • ¿Hay alguna manera de resolver este problema?

Los corchetes en glob se utilizan para las clases de caracteres (por ejemplo, [az] coincidirá con las letras en minúscula). Puedes poner cada corchete en una clase de personaje para forzar que coincidan:

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

[[] es una clase de caracteres que contiene solo el carácter [ , y []] es una clase de caracteres que contiene solo el carácter ] (el corchete de cierre se puede colocar en una clase de caracteres colocándolo en la primera posición).

Además, dado que los paréntesis no se escapan en los literales de cadena, su código buscará una barra invertida así como un corchete.


Puede usar path.replace(''['', ''[[]'') para que las rutas de entrada arbitrarias sean manejadas por glob correctamente.


fnmatch usa fnmatch bajo el capó. Podrías usarlo directamente:

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

O usando (no público) glob.glob1() (está presente al menos en Python 2.3+, incluido Python 3):

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

Aquí está la implementación de 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)