在属性字符串上强制使用ASCII字符的更好方法



我有一种方法可以为对象的所有字符串属性剥离非ASCII[0:126]中的字符串字符:

def niceEncoding(string):
    new = ''
    #matches all printable ascii characters (0 to 126)
    n = re.compile("[ -~]")
    for char in n.findall(string):
        new += char
    return new
def cleanObjEncodings(obj):
    for k, v in vars(obj).items():
        if type(v) is str:
            setattr(obj, k, niceEncoding(v))
    return obj

人们对更有效的方法有想法吗?

//

选择改进的方法(感谢):

non_printable = re.compile("[^ -~]")
def cleanObjEncodings(obj):
    for k, v in vars(obj).items():
        if type(v) is str:
            setattr(obj, k, non_printable.sub('', v))
    return obj

把正则表达式的意义颠倒一下怎么样?与其匹配字符,不如匹配的字符,并将它们分别替换为空字符串。

如果将正则表达式的构建分离开来,代码会变得更加干净,而正则表达式只需要出现一次。

#matches all except printable ascii characters (32 to 126)
re_non_printable = re.compile("[^ -~]")
def niceEncoding(string):
    return re_non_printable.sub("", string)

强调可读性:

from string import printable
def niceEncoding(str):
    printable_characters = frozenset(printable)
    return ''.join(c for c in str if c in printable_characters)

一种可能更快(我实际上还没有介绍)但可读性较差的方法:

def niceEncoding(str):
    unprintable_characters = ''.join(chr(i) for i in (range(0, 32) + range(127, 256)))
    return str.translate(None, unprintable_characters)

最新更新