这个小程序可以加快速度吗?有了elif,它让理解变得无法控制,但也许我没有以正确的方式尝试过。
def cleanup(s):
strng = ''
good = ['\t', '\r', '\n']
for char in s:
if unicodedata.category(char)[0]!="C":
strng += char
elif char in good:
strng += char
elif char not in good:
strng += ' '
return strng
答案 0 :(得分:1)
如果我正确理解您的任务,您希望将所有 unicode控制字符替换为空格, \t
,\n
和{{1}除外}}
以下是使用正则表达式而不是循环来更有效地执行此操作的方法。
\r
您可以通过操纵构成import re
# make a string of all unicode control characters
# EXCEPT \t - chr(9), \n - chr(10) and \r - chr(13)
control_chars = ''.join(map(unichr, range(0,9) + \
range(11,13) + \
range(14,32) + \
range(127,160)))
# build your regular expression
cc_regex = re.compile('[%s]' % re.escape(control_chars))
def cleanup(s):
# substitute all control characters in the regex
# with spaces and return the new string
return cc_regex.sub(' ', s)
变量的范围来控制要包含或排除的字符。请参阅List of Unicode characters。
编辑:计时结果。
出于好奇,我进行了一些计时测试,看看当前三种方法中哪一种最快。
我制作了三个名为control_chars
的方法,它是OP代码的副本; cleanup_op(s)
这是Cristian Ciupitu的答案; cleanup_loop(s)
这是我的代码。
这是我跑的:
cleanup_regex(s)
结果:
cleanup_op在 1.1秒
中完成cleanup_loop在 0.02秒
中完成cleanup_regex以 0.004秒
结束因此,其中一个答案是对原始代码的重大改进。我认为@CristianCiupitu给出了一个更优雅和pythonic的答案,而正则表达式仍然更快。
答案 1 :(得分:0)
如果我理解正确,您希望将所有Unicode控制字符转换为空格,除了选项卡,回车和新行。您可以使用str.translate
:
good = map(ord, '\t\r\n')
TBL_CONTROL_TO_SPACE = {
i: u' '
for i in xrange(sys.maxunicode)
if unicodedata.category(unichr(i))[0] == "C" and i not in good
}
def cleanup(s):
return s.translate(TBL_CONTROL_TO_SPACE)