删除string中的字符列表

我想删除python中的string中的字符:

string.replace(',', '').replace("!", '').replace(":", '').replace(";", '')... 

但我有很多人物,我必须删除。 我想了一个清单

 list = [',', '!', '.', ';'...] 

但是,我怎样才能使用list来replacestring中的string

如果你使用python2而你的input是string(而不是unicode),绝对最好的方法是str.translate

 >>> chars_to_remove = ['.', '!', '?'] >>> subj = 'AB!C?' >>> subj.translate(None, ''.join(chars_to_remove)) 'ABC' 

否则,有以下选项需要考虑:

A.通过char迭代主题字符,省略不需要的字符并join结果列表:

 >>> sc = set(chars_to_remove) >>> ''.join([c for c in subj if c not in sc]) 'ABC' 

(请注意,生成器版本''.join(c for c ...)效率较低)。

B.dynamic创build正则expression式,使用空stringre.sub创build正则expression式:

 >>> import re >>> rx = '[' + re.escape(''.join(chars_to_remove)) + ']' >>> re.sub(rx, '', subj) 'ABC' 

re.escape确保像^或者]这样的字符不会破坏正则expression式)。

C.使用translate的映射变体 :

 >>> chars_to_remove = [u'δ', u'Γ', u'ж'] >>> subj = u'AжBδCΓ' >>> dd = {ord(c):None for c in chars_to_remove} >>> subj.translate(dd) u'ABC' 

完整的testing代码和时间:

 #coding=utf8 import re def remove_chars_iter(subj, chars): sc = set(chars) return ''.join([c for c in subj if c not in sc]) def remove_chars_re(subj, chars): return re.sub('[' + re.escape(''.join(chars)) + ']', '', subj) def remove_chars_re_unicode(subj, chars): return re.sub(u'(?u)[' + re.escape(''.join(chars)) + ']', '', subj) def remove_chars_translate_bytes(subj, chars): return subj.translate(None, ''.join(chars)) def remove_chars_translate_unicode(subj, chars): d = {ord(c):None for c in chars} return subj.translate(d) import timeit, sys def profile(f): assert f(subj, chars_to_remove) == test t = timeit.timeit(lambda: f(subj, chars_to_remove), number=1000) print ('{0:.3f} {1}'.format(t, f.__name__)) print (sys.version) PYTHON2 = sys.version_info[0] == 2 print ('\n"plain" string:\n') chars_to_remove = ['.', '!', '?'] subj = 'AB!C?' * 1000 test = 'ABC' * 1000 profile(remove_chars_iter) profile(remove_chars_re) if PYTHON2: profile(remove_chars_translate_bytes) else: profile(remove_chars_translate_unicode) print ('\nunicode string:\n') if PYTHON2: chars_to_remove = [u'δ', u'Γ', u'ж'] subj = u'AжBδCΓ' else: chars_to_remove = ['δ', 'Γ', 'ж'] subj = 'AжBδCΓ' subj = subj * 1000 test = 'ABC' * 1000 profile(remove_chars_iter) if PYTHON2: profile(remove_chars_re_unicode) else: profile(remove_chars_re) profile(remove_chars_translate_unicode) 

结果:

 2.7.5 (default, Mar 9 2014, 22:15:05) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] "plain" string: 0.637 remove_chars_iter 0.649 remove_chars_re 0.010 remove_chars_translate_bytes unicode string: 0.866 remove_chars_iter 0.680 remove_chars_re_unicode 1.373 remove_chars_translate_unicode --- 3.4.2 (v3.4.2:ab2c023a9432, Oct 5 2014, 20:42:22) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] "plain" string: 0.512 remove_chars_iter 0.574 remove_chars_re 0.765 remove_chars_translate_unicode unicode string: 0.817 remove_chars_iter 0.686 remove_chars_re 0.876 remove_chars_translate_unicode 

(作为一个侧面说明, remove_chars_translate_bytes的数字可能会给我们一个线索,为什么业界不愿采用Unicode这么长时间)。

你可以使用str.translate()

 s.translate(None, ",!.;") 

例:

 >>> s = "asjo,fdjk;djaso,oio!kod.kjods;dkps" >>> s.translate(None, ",!.;") 'asjofdjkdjasooiokodkjodsdkps' 

您可以使用翻译方法。

 s.translate(None, '!.;,') 
 ''.join(c for c in myString if not c in badTokens) 

另一种使用正则expression式的方法:

 ''.join(re.split(r'[.;!?,]', s)) 

你可以使用这样的东西

 def replace_all(text, dic): for i, j in dic.iteritems(): text = text.replace(i, j) return text 

这个代码不是我自己的,来自这里的是一篇很好的文章,并深入讨论了这一点

为什么不是简单的循环?

 for i in replace_list: string = string.replace(i, '') 

另外,避免命名列表“列表”。 它覆盖了内置的函数list

如果您使用的是python3并寻找translate解决scheme – function已更改,现在需要1个参数而不是2个。

该参数是一个表(可以是字典),其中每个键是要查找的字符的Unicode序数(int),并且该值是replace(可以是Unicode序号或用于映射键的string)。

这是一个用法示例:

 >>> list = [',', '!', '.', ';'] >>> s = "This is, my! str,ing." >>> s.translate({ord(x): '' for x in list}) 'This is my string' 

另外一个关于删除UTF-8口音的有趣话题形成了一个将string转换为标准非加重字符的string:

删除python unicodestring中的重音符号的最佳方法是什么?

代码从主题中提取:

 import unicodedata def remove_accents(input_str): nkfd_form = unicodedata.normalize('NFKD', input_str) return u"".join([c for c in nkfd_form if not unicodedata.combining(c)]) 

也许更现代和function的方式来实现你所希望的:

 >>> subj = 'AB!C?' >>> list = set([',', '!', '.', ';', '?']) >>> filter(lambda x: x not in list, subj) 'ABC' 

请注意,对于这个特定的目的来说,这是一个过分的矫枉过正,但是一旦你需要更复杂的条件,filter就很方便

简单的方法,

 import re str = 'this is string ! >><< (foo---> bar) @-tuna-# sandwich-%-is-$-* good' // condense multiple empty spaces into 1 str = ' '.join(str.split() // replace empty space with dash str = str.replace(" ","-") // take out any char that matches regex str = re.sub('[!@#$%^&*()_+<>]', '', str) 

输出:

this-is-string--foo----bar--tuna---sandwich--is---good

这些天我正在潜入计划,现在我觉得很好在recursion和评估。 哈哈哈。 只是分享一些新的方法:

首先,评估它

 print eval('string%s' % (''.join(['.replace("%s","")'%i for i in replace_list]))) 

第二,缓解它

 def repn(string,replace_list): if replace_list==[]: return string else: return repn(string.replace(replace_list.pop(),""),replace_list) print repn(string,replace_list) 

嘿,不要冷落。 我只是想分享一些新的想法。

这怎么样 – 一个class轮。

 reduce(lambda x,y : x.replace(y,"") ,[',', '!', '.', ';'],";Test , , !Stri!ng ..") 

我觉得这很简单,会做!

 list = [",",",","!",";",":"] #the list goes on..... theString = "dlkaj;lkdjf'adklfaj;lsd'fa'dfj;alkdjf" #is an example string; newString="" #the unwanted character free string for i in range(len(TheString)): if theString[i] in list: newString += "" #concatenate an empty string. else: newString += theString[i] 

这是做到这一点的一种方法。 但是,如果您厌倦了保留要删除的字符列表,则可以通过使用迭代的string的顺序号来实现。 订单号是该字符的ascii值。 0作为字符的ascii数字是48,而小写字母z的ascii数字是122,所以:

 theString = "lkdsjf;alkd8a'asdjf;lkaheoialkdjf;ad" newString = "" for i in range(len(theString)): if ord(theString[i]) < 48 or ord(theString[i]) > 122: #ord() => ascii num. newString += "" else: newString += theString[i] 

我正在考虑这个解决scheme。 首先,我将inputstring作为列表。 然后我会replace列表中的项目。 然后通过使用连接命令,我将返回列表作为一个string。 代码可以是这样的:

 def the_replacer(text): test = [] for m in range(len(text)): test.append(text[m]) if test[m]==','\ or test[m]=='!'\ or test[m]=='.'\ or test[m]=='\''\ or test[m]==';': #.... test[n]='' return ''.join(test) 

这将从string中删除任何东西。 你怎么看?