Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在从字符串中删除特定的控制字符(\n\r\t)_Python_String - Fatal编程技术网

Python 正在从字符串中删除特定的控制字符(\n\r\t)

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

我有相当多的文本,其中包括控制字符,\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: 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 usec
python2.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个字符的字符串上尝试这个完全没有意义。请参阅我答案中的编辑。