您好需要从字符串中删除所有特殊字符,标点符号和空格,以便我只有字母和数字。最终字符串的长度应该只有前200个字符。
我知道一个解决方案: -
string = "Special $#! character's spaces 888323"
string = ''.join(e for e in string if e.isalnum())[:200]
但是这将首先删除所有不需要的字符,然后将其切片。 有没有像发电机那样工作的东西,即一旦总字符数为200,它就会破裂。我想要一个pythonic解决方案。 PS:我知道我可以通过FOR循环实现它。
答案 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