从字符串中删除所有特殊字符,标点符号并将其限制为前200个字符

时间:2015-02-17 05:55:29

标签: python string

您好需要从字符串中删除所有特殊字符,标点符号和空格,以便我只有字母和数字。最终字符串的长度应该只有前200个字符。

我知道一个解决方案: -

string = "Special $#! character's   spaces 888323"

string = ''.join(e for e in string if e.isalnum())[:200]

但是这将首先删除所有不需要的字符,然后将其切片。 有没有像发电机那样工作的东西,即一旦总字符数为200,它就会破裂。我想要一个pythonic解决方案。 PS:我知道我可以通过FOR循环实现它。

3 个答案:

答案 0 :(得分:1)

from itertools import islice
"".join(islice((e for e in string if e.isalnum()), 200))

但就个人而言,我觉得for循环对我来说听起来好多了。

答案 1 :(得分:1)

将生成器表达式或函数与itertools.islice

一起使用
from itertools import islice
s = "Special $#! character's   spaces 888323"
gen = (e for e in s if e.isalnum())
new_s = ''.join(islice(gen, 200))

请注意,如果字符串不是很大且数字n(此处为200)与字符串长度相比不小,那么您应该使用str.translate进行简单的切片,因为它会非常快与基于Python的for循环相比:

>>> from string import whitespace, punctuation
>>> s.translate(None, whitespace+punctuation)[:10]
'Specialcha'

大字符串的一些时序比较:

>>> s = "Special $#! character's   spaces 888323" * 10000
>>> len(s)
390000
# For very small n
>>> %timeit ''.join(islice((e for e in s if e.isalnum()), 200))
10000 loops, best of 3: 20.2 µs per loop
>>> %timeit s.translate(None, whitespace+punctuation)[:200]
1000 loops, best of 3: 383 µs per loop

# For mid-sized n
>>> %timeit ''.join(islice((e for e in s if e.isalnum()), 10000))
1000 loops, best of 3: 930 µs per loop
>>> %timeit s.translate(None, whitespace+punctuation)[:10000]
1000 loops, best of 3: 378 µs per loop

# When n is comparable to length of string.
>>> %timeit ''.join(islice((e for e in s if e.isalnum()), 100000))
100 loops, best of 3: 9.41 ms per loop
>>> %timeit s.translate(None, whitespace+punctuation)[:100000]
1000 loops, best of 3: 385 µs per loop

答案 2 :(得分:1)

如果正则表达式没有解决您的问题,那可能就是您还没有使用足够的 :-)这里是一个单行(折扣导入)将其限制为20个字符(因为您的测试数据与您的规格不符):

>>> import re
>>> string = "Special $#! character's   spaces 888323"
>>> re.sub("[^A-Za-z0-9]","",string)[:20]
'Specialcharactersspa'

虽然技术上不是一个生成器,但如果您不必处理真正的大量字符串,它也会正常工作。

做的是避免拆分并重新加入原始解决方案:

''.join(e for e in something)

毫无疑问,正则表达式处理会有一些成本,但我很难相信它与构建临时列表一样高,然后再将其拆分为字符串。不过,如果你担心,你应该衡量,而不是猜测!


如果你想要一个实际的生成器,它很容易实现一个:

class alphanum(object):
    def __init__(self, s, n):
        self.s = s
        self.n = n
        self.ix = 0

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):
        if self.n <= 0:
            raise StopIteration()
        while self.ix < len(self.s) and not self.s[self.ix].isalnum():
            self.ix += 1
        if self.ix == len(self.s):
            raise StopIteration()

        self.ix += 1
        self.n -= 1
        return self.s[self.ix-1]

    def remainder(self):
        return ''.join([x for x in self])

for x in alphanum("Special $#! chars", 10):
    print x

print alphanum("Special $#! chars", 10).remainder()

显示了如何将其用作“角色”。迭代器以及字符串修饰符:

S
p
e
c
i
a
l
c
h
a
Specialcha