我正在编写一个脚本,该脚本必须处理由Windows和Linux用户手动修改的目录.Windows用户往往不关心分配文件名的情况.
有没有办法在Python的Linux端处理这个问题,即我可以得到一个不区分大小写,类似于glob的行为吗?
Geo*_*ing 46
您可以用[cC],via替换每个字母c
import glob
def insensitive_glob(pattern):
def either(c):
return '[%s%s]' % (c.lower(), c.upper()) if c.isalpha() else c
return glob.glob(''.join(map(either, pattern)))
Run Code Online (Sandbox Code Playgroud)
Fre*_*Foo 24
使用不区分大小写的正则表达式而不是glob模式.fnmatch.translate
从glob模式生成一个正则表达式,所以
re.compile(fnmatch.translate(pattern), re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)
给出一个不区分大小写的glob模式版本作为编译的RE.
请记住,如果文件系统是通过在类Unix文件系统在Linux中托管,用户将能够创建文件foo
,Foo
并FOO
在同一目录下.
要使用"globexpression"检索目录"path"的文件(和仅文件):
list_path = [i for i in os.listdir(path) if os.path.isfile(os.path.join(path, i))]
result = [os.path.join(path, j) for j in list_path if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]
Run Code Online (Sandbox Code Playgroud)
散步:
result = []
for root, dirs, files in os.walk(path, topdown=True):
result += [os.path.join(root, j) for j in files \
if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]
Run Code Online (Sandbox Code Playgroud)
最好也编译正则表达式,而不是
re.match(fnmatch.translate(globexpression)
Run Code Online (Sandbox Code Playgroud)
做(在循环之前):
reg_expr = re.compile(fnmatch.translate(globexpression), re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)
然后在循环中替换:
result += [os.path.join(root, j) for j in files if re.match(reg_expr, j)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18266 次 |
最近记录: |