2024-04-19 22:35:16 发布
网友
我想删除python中字符串中的字符:
string.replace(',', '').replace("!", '').replace(":", '').replace(";", '')...
但我有很多角色要删除。我想了一张单子
list = [',', '!', '.', ';'...]
但是如何使用list替换string中的字符?
list
string
如果您使用的是python2,并且您的输入是字符串(而不是unicodes),那么绝对最好的方法是^{}:
>>> chars_to_remove = ['.', '!', '?'] >>> subj = 'A.B!C?' >>> subj.translate(None, ''.join(chars_to_remove)) 'ABC'
否则,需要考虑以下选项:
A.逐字符迭代主题,省略不需要的字符和^{}结果列表:
>>> sc = set(chars_to_remove) >>> ''.join([c for c in subj if c not in sc]) 'ABC'
(注意,生成器版本''.join(c for c ...)的效率会更低)。
''.join(c for c ...)
B.动态创建正则表达式并使用空字符串^{}:
>>> import re >>> rx = '[' + re.escape(''.join(chars_to_remove)) + ']' >>> re.sub(rx, '', subj) 'ABC'
(^{}确保像^或]这样的字符不会破坏正则表达式)。
^
]
C.使用mapping variant of ^{}:
>>> 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'
完整的测试代码和时间安排:
#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 = 'A.B!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)。
remove_chars_translate_bytes
您可以使用^{}:
s.translate(None, ",!.;")
示例:
>>> s = "asjo,fdjk;djaso,oio!kod.kjods;dkps" >>> s.translate(None, ",!.;") 'asjofdjkdjasooiokodkjodsdkps'
您可以使用translate方法。
s.translate(None, '!.;,')
如果您使用的是python2,并且您的输入是字符串(而不是unicodes),那么绝对最好的方法是^{} :
否则,需要考虑以下选项:
A.逐字符迭代主题,省略不需要的字符和^{} 结果列表:
(注意,生成器版本
''.join(c for c ...)
的效率会更低)。B.动态创建正则表达式并使用空字符串^{} :
(^{} 确保像
^
或]
这样的字符不会破坏正则表达式)。C.使用mapping variant of ^{} :
完整的测试代码和时间安排:
结果:
(顺便说一下,
remove_chars_translate_bytes
的数字可能会给我们一个线索,为什么业界这么长时间不愿意采用Unicode)。您可以使用^{} :
示例:
您可以使用translate方法。
相关问题 更多 >
编程相关推荐