1

我有一个字符串,我正在尝试删除所有不是字母数字的字符,也不是这个集合中的字符

'''!$%*()_-=+\/.,><:;'"?|'''.

我知道这会删除所有非字母数字字符,但我怎样才能做得更好?

re.sub(r'\W+','',line)
4

3 回答 3

7

Python 2.x 非正则表达式解决方案:

punctuation = '''!$%*()_-=+\/.,><:;'"?|'''
allowed = string.digits + string.letters + punctuation
filter(allowed.__contains__, s)

要过滤的字符串是s. (这可能不是长字符串最快的解决方案。)

于 2012-05-31T18:53:08.580 回答
4

归功于这个线程:Remove specific characters from a string in python

首先,无需手动重新输入所有标点符号。为了方便起见, string 模块将 string.punctuation 定义为属性。(help(string)用于查看其他可用的类似定义)

>>> import string
>>>string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

解决方案的确切应用将需要一些摆弄来定义不需要的字符;一个很大的缺点是,在这种形式下,它只会删除您告诉它删除的字符。如果您确定您的文件是 100% ASCII 字符,那么您可以定义:

>>> delchars = ''.join(c for c in map(chr, range(256)) if c not in (string.punctuation + string.digits + string.letters) )

您可以通过丢弃字符来过滤字符:

>>> text.translate(None, delchars)

编辑:以下是各种方法的一些有趣的计时信息: 从 Python 中的字符串中剥离除字母数字字符之外的所有内容

于 2012-05-31T19:10:49.610 回答
1

在 Python 3.x 中,您可以使用translatestring 上的方法来删除不需要的字符:

>>> def remove(string, characters):
        return string.translate(str.maketrans('', '', characters))

>>> import string
>>> remove(string.printable, string.ascii_letters + string.digits + \
                             '''!$%*()_-=+\/.,><:;'"?|''')
'#&@[]^`{}~ \t\n\r\x0b\x0c'
于 2012-05-31T19:36:51.050 回答