在Python中,如何将文件名中的某些字符列为白名单?

在Python中,如何将文件名中的某些字符列为白名单?,python,regex,string,Python,Regex,String,为了保护上传的图像名的安全,我想从string.ascii_字母、string.digits、dot和一个空格中去掉图像的文件名 所以我想知道什么是对照其他字符检查文本的最佳方法 import re import os s = 'asodgnasAIDID12313%*(@&(!$ 1231' result = re.sub('[^a-zA-Z\d\. ]|( ){2,}','',s ) if result =='' or os.path.splitext(result)[0].issp

为了保护上传的图像名的安全,我想从string.ascii_字母、string.digits、dot和一个空格中去掉图像的文件名

所以我想知道什么是对照其他字符检查文本的最佳方法

import re
import os
s = 'asodgnasAIDID12313%*(@&(!$ 1231'
result = re.sub('[^a-zA-Z\d\. ]|( ){2,}','',s )
if result =='' or os.path.splitext(result)[0].isspace():
    print "not a valid name"
else:
    print "valid name"
编辑:

将其更改为仅将一个空格添加到白名单中+添加了重新导入

编辑:


对其进行了更改,这样它也将只列出一个空白+添加的导入re

不确定它是否是您需要的,但请尝试一下:

import sys, os

fileName, fileExtension = os.path.splitext('image  11%%22.jpg')
fileExtension = fileExtension.encode('ascii', 'ignore')
fileName = fileName.encode('ascii', 'ignore')
if fileExtension[1:] in ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tga']:
    fileName = ''.join(e for e in fileName if e.isalnum())
    print fileName+fileExtension
    #image1122.jpg
else:
    print "Extension not supported"

不确定这是否是您需要的,但请尝试一下:

import sys, os

fileName, fileExtension = os.path.splitext('image  11%%22.jpg')
fileExtension = fileExtension.encode('ascii', 'ignore')
fileName = fileName.encode('ascii', 'ignore')
if fileExtension[1:] in ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tga']:
    fileName = ''.join(e for e in fileName if e.isalnum())
    print fileName+fileExtension
    #image1122.jpg
else:
    print "Extension not supported"

我不会用正则表达式来做这个。唯一棘手的要求是单个空间,但这也可以做到

import string

whitelist = set(string.ascii_letters + string.digits)
good_filename = "herearesomelettersand123numbers andonespace"
bad_filename = "symbols&#! and more than one space"

def strip_filename(fname, whitelist):
    """Strips a filename

    Removes any character from string `fname` and removes all but one
    whitespace.
    """

    whitelist.add(" ")

    stripped = ''.join([ch for ch in fname if ch in whitelist])
    split = stripped.split()
    result = " ".join([split[0], ''.join(split[1:])])
    return result
然后用以下词语来称呼它:

good_sanitized = strip_filename(good_filename, whitelist)
bad_sanitized = strip_filename(bad_filename, whitelist)
print(good_sanitized)
# 'herearesomelettersand123numbers andonespace'
print(bad_sanitized)
# 'symbols andmorethanonespace'

我不会用正则表达式来做这个。唯一棘手的要求是单个空间,但这也可以做到

import string

whitelist = set(string.ascii_letters + string.digits)
good_filename = "herearesomelettersand123numbers andonespace"
bad_filename = "symbols&#! and more than one space"

def strip_filename(fname, whitelist):
    """Strips a filename

    Removes any character from string `fname` and removes all but one
    whitespace.
    """

    whitelist.add(" ")

    stripped = ''.join([ch for ch in fname if ch in whitelist])
    split = stripped.split()
    result = " ".join([split[0], ''.join(split[1:])])
    return result
然后用以下词语来称呼它:

good_sanitized = strip_filename(good_filename, whitelist)
bad_sanitized = strip_filename(bad_filename, whitelist)
print(good_sanitized)
# 'herearesomelettersand123numbers andonespace'
print(bad_sanitized)
# 'symbols andmorethanonespace'


所以一个文件名中必须有一个空格?请看一下这个文件,它有大约8种不同的方法来检查和删除某些字符。@PruthviRaj,好吧,只是为了避免混乱的名称,是的。@BhargavRao不是。但它确实有用。谢谢@是的。我只是添加了这个链接来向您展示一些方法。这当然不能回答你的问题。很高兴你发现它有用。干杯。那么一个文件名中必须有一个空格吗?请看一下这个文件,它有大约8种不同的方法来检查和删除某些字符。@PruthviRaj,好的,只是为了避免混乱的名称,是的。@BhargavRao不是。但它确实有用。谢谢@是的。我只是添加了这个链接来向您展示一些方法。这当然不能回答你的问题。很高兴你发现它有用。干杯,非常简洁。要完成答案,只需添加import re。谢谢对不起,我刚发现一个警告。如果选择带有多个空格的utf8文件名,则最终名称将类似于“”,这是不可取的。有什么想法吗?如果我理解正确的话,它应该是空的,如果是这样的话,现在应该可以了,我用+到{2,}替换了th+双空格,至少到了空格,所以如果空格数不均匀的话,这应该仍然可以。这个解决方案的问题是,如果你输入非ascii文件名,比如s=些 些.jpg'结果将是'.jpg',这是不好的。这是您的要求的一个问题,因为这是一个单一的空格,符合您指定的规则,但在这种情况下,我会添加一个特殊的情况来处理这个非常简洁。要完成答案,只需添加import re。谢谢对不起,我刚发现一个警告。如果选择带有多个空格的utf8文件名,则最终名称将类似于“”,这是不可取的。有什么想法吗?如果我理解正确的话,它应该是空的,如果是这样的话,现在应该可以了,我用+到{2,}替换了th+双空格,至少到了空格,所以如果空格数不均匀的话,这应该仍然可以。这个解决方案的问题是,如果你输入非ascii文件名,比如s=些 些.jpg“结果将是“.jpg”,这是不好的。这是您的要求的一个问题,因为这是一个单一的空格,它符合您指定的规则,但在这种情况下,我会添加一个特殊情况来处理此问题。请删除重复的答案是。Net有点问题,我想我得更新一篇帖子。已删除复制。对于非ascii文件名,此操作失败。拿走些 些.jpg’。您的方法返回“jpg”。请删除两个重复的应答Yes。Net有点问题,我想我得更新一篇帖子。已删除复制。对于非ascii文件名,此操作失败。拿走些 些.jpg’。您的方法返回“jpg”。当文件名不是ascii时,它返回.jpg。您可以对文件扩展名和文件扩展名进行ascii编码。在检查它之前,对“ascii”、“忽略”进行编码。当文件名不是ascii时,它返回.jpg。您可以对文件扩展名和文件扩展名进行ascii编码。对“ascii”、“忽略”进行编码,在检查之前。