首页 > 解决方案 > 这个修改后的清理功能是否正确?

问题描述

所以我是python的新手,我希望我能对我清理的函数有所了解。我的清理工作不仅要保留字母,还要保留数字,以及某些符号,如“@”和“_”。这是我的代码。

def cleanedup(s):
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    digits = '0123456789'
    cleantext = ''
    for character in s.lower():
        if character in alphabet, digits, or characters == '@', '_':
            cleantext += character
        else:
            cleantext += ' '
    return cleantext

我希望看看这个功能是否正确或是否需要一些调整。如果需要进行一些调整,我希望它与我上面的没有什么不同。谢谢你。

标签: pythonpython-3.xfunction

解决方案


character in alphabet, digits, or characters == '@', '_'不是有效的 Python 表达式。我很惊讶你没有收到错误。表达这一点的正确方法是

if character in alphabet or character in digits or character in ('@', '_'):

更好的方法是将所有允许的字符压缩到一个数据结构中,然后将这些字符与之进行比较:

from string import acii_lowercase, digits

allowed = set(ascii_lowercase + digits + '@_')

def cleanedup(s):
    return ''.join(c if c in allowed else ' ' for c in s.lower())

''.join是组合许多字符串的另一种方法,它不会在此过程中创建额外的字符串。

Aset是一种类似于列表的数据结构,其工作方式更像是一个数学集合。查找对象是否在集合中比查找列表要快。

做你想做的更高级的方法是使用正则表达式:

import re

pattern = re.compile("[^a-z0-9@_]")  # All characters that are not a-z, 0-9, _, and @

def cleanedup(s):
    return pattern.sub(' ', s.lower())

推荐阅读