【问题标题】:How to remove special characters and letters from a line read from a text file in Python?如何从 Python 中从文本文件中读取的行中删除特殊字符和字母?
【发布时间】:2010-07-14 03:03:44
【问题描述】:

如何从从文本文件读取的行中删除特殊字符和字母,同时保留空格?假设我们在一个文件中有以下内容:

16 ` C38# 26535 2010 4 14 2 7 7 3 8^@1 2 15 100 140 30 $ 14^] (2003 2 !-6 021 0 14 !2 3 !1 0 35454 0$ ^@0 0 0 "0 "63 194 (56 188 26 27" 24 0 0 10� 994!8 58 0 0 " � 0 0 32�47 32767 32767 ! 1

输出基本上应该是:

16 38 26535 2010 4 14 2 7 7 3 8 1 2 15 100 140 30 14 2003 2 -6 021 0 14 2 3 1 0 35454 0 0 0 0 0 63 194 56 188 26 27 24 0 0 10 994 8 58 0 0 0 0 32 47 32767 32767 1

最直接的方法是什么?

【问题讨论】:

  • 请务必准确地定义“特殊”的含义。

标签: python string


【解决方案1】:
import re

output_string = re.sub(r'[^\d\s-]', '', input_string)

[^\d\s-] 模式将匹配任何数字、破折号或空格的内容 - 因此,将任何匹配替换为空字符串将删除除数字(包括减号)和空格之外的所有内容.

【讨论】:

    【解决方案2】:

    如果您只想保留数字、加号和减号以及所有空格,最简单的方法可能是

    import re
       ...
    line = re.sub(r'[^\d\s+-]+', '', line)
    

    其内容为“用任何内容替换一个或多个非数字非空白的每个序列”。

    更快的是字符串的translate 方法,但是设置起来不太简单,所以,既然你要求“直截了当”,我建议使用re 方法(现在准备好迎接re-haters 的肯定尖叫声......;-)。

    【讨论】:

      【解决方案3】:
      ''.join([x for x in s if x in string.digits+string.whitespace])
      

      或者如果您真正想要的是数字列表:

      import re
      re.findall('\d+',s)
      

      【讨论】:

        【解决方案4】:

        LOL @Alex 的正则表达式评论...希望没有太多 很多仇恨者。话虽如此,尽管它们更快,因为它们是在 C 中执行的,但正则表达式不是我的首选……也许我对 famous jwz quote 有偏见:'''有些人,当遇到问题,想“我知道,我会使用正则表达式。”现在他们有两个问题。'''

        我会说,解决这个家庭作业很棘手,因为解决方案充满了错误,正如目前在现有解决方案中所看到的那样。也许这是偶然的,因为它需要 OP 调试和纠正这些建议,而不是仅仅将它们逐字剪切并粘贴到他们的分配解决方案中。

        就问题而言,包括但不限于:

        • 留出连续的空格
        • 删除负号,并
        • 将多个号码合并在一起

        底线...我最喜欢哪种解决方案?我将启动以下其中一项并从那里进行调试:

        对于正则表达式,我会选择:

        @Alex 的解决方案或 @Matt 的解决方案,如果我只想要数据而不是“黄金”字符串

        对于字符串处理,我将@Matt的解决方案修改为:

        keep = set(string.whitespace+string.digits+'+-')
        line = ''.join(x for x in line if x in keep)
        

        最后,@Greg 有一个好点子。如果没有明确的规范,这些只是部分解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-15
          • 1970-01-01
          • 2021-12-08
          • 2015-01-28
          • 2012-03-04
          • 1970-01-01
          相关资源
          最近更新 更多