【问题标题】:Deleting specific control characters(\n \r \t) from a string从字符串中删除特定的控制字符(\n \r \t)
【发布时间】:2011-02-10 09:44:17
【问题描述】:

我有相当多的文本,其中包括控制字符,如 \n \t 和 \r。 我需要用一个简单的空格替换它们——>“”。最快的方法是什么? 谢谢

【问题讨论】:

  • 显然,正如 Python 之禅所建议的那样,只有这样的方法 ;-)
  • 当字符串有多个相邻的此类字符时,例如foo\r\nbar,您想将\r\n替换为两个空格还是只替换1个?
  • 我只想用 1 个替换它
  • 考虑去除前导和尾随空格。然后请编辑您的问题,使其准确地指定您想要的内容。
  • 如果您还想去除前导和尾随空格,请查看this answer

标签: python string


【解决方案1】:

我认为最快的方法是使用str.translate():

import string
s = "a\nb\rc\td"
print s.translate(string.maketrans("\n\t\r", "   "))

打印

a b c d

编辑:这又一次变成了关于性能的讨论,这里有一些数字。对于长字符串,translate() 比使用正则表达式方式快:

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 倍。

【讨论】:

  • 需要注意的是,string.translate 和 string.makestrans 在 Python3 中不可用。基于 re 的解决方案似乎更好。
  • @Ignacio: import string;hasattr(string,'translate');hasattr(string,'maketrans') 如果你执行 hasattr(str,'translate') 和 hasattr( str,'maketrans') 是真的。模块字符串只是字符串常量的集合。此外,根据定义和使用maketrans的正确方法是bytes.maketrans。谢谢!
【解决方案2】:

如果您想规范化空格(将一个或多个空格字符替换为单个空格,并去除前导和尾随空格),这可以通过使用字符串方法来完成:

>>> text = '   foo\tbar\r\nFred  Nurke\t Joe Smith\n\n'
>>> ' '.join(text.split())
'foo bar Fred Nurke Joe Smith'

【讨论】:

    【解决方案3】:

    你也可以试试正则表达式:

    import re
    regex = re.compile(r'[\n\r\t]')
    regex.sub(' ', my_str)

    【讨论】:

    • 我对比了实际性能,看起来使用正则表达式和使用字符串模块一样快。
    • 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 微秒
    • 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 微秒
    • @Michal - 您是仅将 regex.sub(...)s.translate(string.maketrans(...)) 还是与 s.translate(preparedTrans) 进行比较?
    • @Michal:在 7 个字符的字符串上尝试这个完全没有意义。请参阅我的答案中的编辑。
    【解决方案4】:

    my_string 是要删除特定控制字符的字符串。 由于字符串在python中是不可变的,替换操作后需要将其分配给另一个字符串或重新分配:

    my_string = re.sub(r'[\n\r\t]*', '', my_string)
    

    【讨论】:

      【解决方案5】:
      >>> re.sub(r'[\t\n\r]', ' ', '1\n2\r3\t4')
      '1 2 3 4'
      

      【讨论】:

        【解决方案6】:

        使用正则表达式

        re.sub(r'\s+', ' ', '1\n2\r3\t4')
        

        没有正则表达式

        >>> ' '.join('1\n\n2\r3\t4'.split())
        '1 2 3 4'
        >>>
        

        【讨论】:

          猜你喜欢
          • 2019-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-19
          • 2021-12-06
          • 1970-01-01
          • 2023-02-01
          • 2020-03-28
          相关资源
          最近更新 更多