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

时间:2010-07-14 03:03:44

标签: python string

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

16`C38#26535 2010 4 14 2 7 7 3 8 ^ @ 1 2     15 100 140 30 $ 14 ^]   (2003 2!-6 0210 14!2 3!1 0 35454    0 $ ^ @ 0 0 0“0”63 194(56 188 26 27“24 0010 994!8 58    0 0“ 0032 473226732767!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 :(得分:3)

import re

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

模式[^\d\s-]将匹配数字,短划线或空格的任何内容 - 因此,用空字符串替换任何匹配将删除除数字之外的所有内容(包括减号)和空白。

答案 1 :(得分:1)

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

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

其中包含“用任何内容替换一个或多个非数字非空格的每个序列”。

字符串的translate方法更快,但 设置起来要简单得多,所以,既然你要求“直截了当”,我建议{{ 1}}方法(现在支持re - 肯定会来到......的仇恨......; - )。

答案 2 :(得分:0)

''.join([x for x in s if x in string.digits+string.whitespace])

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

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

答案 3 :(得分:0)

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有一个好点。没有明确的规范,这些只是部分解决方案。