Python 正在从字符串中删除特定的控制字符(\n\r\t)
我有相当多的文本,其中包括控制字符,\n\t和\r。 我需要将它们替换为一个简单的空格-->“”。最快的方法是什么?Python 正在从字符串中删除特定的控制字符(\n\r\t),python,string,Python,String,我有相当多的文本,其中包括控制字符,\n\t和\r。 我需要将它们替换为一个简单的空格-->“”。最快的方法是什么? 谢谢您也可以尝试正则表达式: import re regex = re.compile(r'[\n\r\t]') regex.sub(' ', my_str) s = "a\nb\rc\td " * 1250000 regex = re.compile(r'[\n\r\t]') %timeit t = regex.sub(" ", s) # 1 loops, best of 3
谢谢您也可以尝试正则表达式:
import re
regex = re.compile(r'[\n\r\t]')
regex.sub(' ', my_str)
s = "a\nb\rc\td " * 1250000
regex = re.compile(r'[\n\r\t]')
%timeit t = regex.sub(" ", s)
# 1 loops, best of 3: 1.19 s per loop
table = string.maketrans("\n\t\r", " ")
%timeit s.translate(table)
# 10 loops, best of 3: 29.3 ms per loop
我认为最快的方法是使用
str.translate()
:
印刷品
a b c d
编辑:由于这再次变成了关于性能的讨论,这里有一些数字。对于长字符串,translate()
比使用正则表达式快得多:
import re
regex = re.compile(r'[\n\r\t]')
regex.sub(' ', my_str)
s = "a\nb\rc\td " * 1250000
regex = re.compile(r'[\n\r\t]')
%timeit t = regex.sub(" ", s)
# 1 loops, best of 3: 1.19 s per loop
table = string.maketrans("\n\t\r", " ")
%timeit s.translate(table)
# 10 loops, best of 3: 29.3 ms per loop
这大约是40倍。使用正则表达式
re.sub(r'\s+', ' ', '1\n2\r3\t4')
没有正则表达式
>>> ' '.join('1\n\n2\r3\t4'.split())
'1 2 3 4'
>>>
如果要规范化空白(用单个空格替换一个或多个空白字符的运行,并去除前导和尾随空白),可以通过使用字符串方法来实现:
>>> text = ' foo\tbar\r\nFred Nurke\t Joe Smith\n\n'
>>> ' '.join(text.split())
'foo bar Fred Nurke Joe Smith'
my_string
是要删除特定控制字符的字符串。
由于字符串在python中是不可变的,在执行替换操作后,需要将其分配给另一个字符串或重新分配:
my_string = re.sub(r'[\n\r\t]*', '', my_string)
显然,正如Python的Zen所建议的那样,只有一种方法可以做到这一点;-)如果字符串有多个相邻的此类字符,例如
foo\r\nbar
,是否要将\r\n
替换为两个空格或仅1?我只想将其替换为1,同时考虑去掉前导和尾随空格。然后请编辑您的问题,使其准确地指定您想要的内容。如果您还想去除前导和尾随空格,请查看。请务必注意,在Python3中,string.translate和string.makestrans不可用。基于re的解决方案似乎更好。@Ignacio:导入字符串;hasattr(字符串,'translate');hasattr(string,'maketrans')将为False,如果执行hasattr(str,'translate')和hasattr(str,'maketrans'),则为True。模块字符串只是字符串常量的集合。此外,根据定义,使用maketrans的正确方法是bytes.maketrans。谢谢我比较了实际性能,似乎使用正则表达式与使用字符串模块一样快。python2.6 timeit.py-s“import string”-s“s='a\nb\rc\td'-s“s.translate(string.maketrans('\n\t\r','')”
10000000个循环,最好是每个循环3:0.0235 usecpython2.6 timeit.py-s“import re”-s“regex=re.compile(r'[\n\r\t]')”-s“regex.sub(''a\nb\rc\td')”
10000000个循环,每个循环3:0.0232 usec的最佳值loop@Michal-您是否将regex.sub(…)
与s.translate(string.maketrans(…)
或s.translate(preparedTrans)进行比较
only?@Michal:在一个包含7个字符的字符串上尝试这个完全没有意义。请参阅我答案中的编辑。