如何在Python中从文本文件读取的行中移除特殊字符和字母?

0 投票
4 回答
3111 浏览
提问于 2025-04-16 01:16

我想知道如何从文本文件中读取一行时,去掉特殊字符和字母,但保留空格。假设我们有一个文件,里面的内容是这样的:

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

那么,最简单的方法是什么呢?

4 个回答

0

哈哈,看到Alex提到正则表达式的评论真有意思……希望不会有太多人反对。不过,虽然正则表达式因为用C语言写的执行速度快,但我并不太喜欢用它……也许是受到了一句著名的jwz名言的影响:“有些人遇到问题时,会想‘我知道,我用正则表达式来解决。’结果他们就多了一个问题。”

我想说,解决这个作业题目其实挺棘手的,因为现有的解决方案中充满了错误。也许这也是一种幸运,因为这迫使提问者去调试和修正这些建议,而不是直接把它们复制粘贴到作业里。

至于问题,主要包括但不限于:

  • 留下连续的空格
  • 去掉负号
  • 把多个数字合并在一起

总的来说……我最喜欢哪些解决方案呢?我会从以下几个开始,然后再进行调试:

如果用正则表达式,我会选择:

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

如果处理字符串,我会修改@Matt的方案为:

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

最后,@Greg说得对。没有明确的规范,这些方案都只是部分解决方案。

1

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

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

这段代码的意思是“把每一段一个或多个不是数字也不是空格的字符替换成空”。

如果想要更快的方式,可以使用字符串的 translate 方法,但这个方法设置起来会复杂一些。所以,既然你想要“简单明了”,我建议使用 re 方法(准备好迎接那些讨厌 re 的人的抱怨吧...;-)。

3
import re

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

这个模式 [^\d\s-] 会匹配任何不是数字、连字符(-)或者空格的东西。因此,如果把匹配到的内容替换成空字符串,就会把除了数字(包括负号)和空格以外的所有东西都去掉。

撰写回答