我得到的任务是从文本文件或字符串中删除所有非数字字符,包括空格,然后在旧字符旁边打印新结果,例如:
之前:
sd67637 8
后:
sd67637 8 = 676378
由于我是初学者,所以我不知道从哪里开始。 请帮忙
是否可能使用Python从字符串中删除除数字以外的字符?
最简单的方法是使用正则表达式
import re
a = 'lkdfhisoe78347834 (())&/&745 '
result = re.sub('[^0-9]','', a)
print result
>>> '78347834745'
有什么办法保留小数点吗?
@mark您可以使用\.指定文字小数点。
为什么不[^\d]+?
逐个字符地遍历字符串,仅包含数字:
new_string = ''.join(ch for ch in your_string if ch.isdigit())
或者在您的字符串上使用一个正则表达式(如果您想在某个时候分别对待不连续的组)...
import re
s = 'sd67637 8'
new_string = ''.join(re.findall(r'\d+', s))
# 676378
然后只需print将它们删除:
print(old_string, '=', new_string)
这更好,因为它不仅适用于ascii
有一个内置的。
string.translate(s, table[, deletechars])
Delete all characters from s
that are in deletechars (if present), and then translate the
characters using table, which must be a 256-character string giving
the translation for each character value, indexed by its ordinal. If
table is None, then only the character deletion step is performed.
>>> import string
>>> non_numeric_chars = ''.join(set(string.printable) - set(string.digits))
>>> non_numeric_chars = string.printable[10:] # more effective method. (choose one)
'sd67637 8'.translate(None, non_numeric_chars)
'676378'
或者,您也可以不导入任何内容(但是没有理由这样做):
>>> chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t
\x0b\x0c'
>>> 'sd67637 8'.translate(None, chars)
'676378'
这应该是最佳答案。
不是真正的>>> s.,d67637 8.translate(None, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ )会产生.,676378
@DarthKotik好点,OP没有提到任何有关特殊字符的内容,但这很容易解决。检查我的编辑。
@InbarRose itll可以工作,但是一旦您想使用一些西里尔符号或某些中文itll就会失败。就您确切知道您的字段中可能出现的符号集而言,这种解决方案是很好的,但这并不是很好。
@DarthKotik OP没有提及特殊字符或编码。无论如何,string.translate都能用正确的输入解决所有这些问题。就像每个问题一样,应该一次解决一个问题。而且在敏捷开发中,不需要过早的优化。问题很简单,答案很简单。如果您想了解细节,我们将全天待在这里。
不兼容Python 3。非常过时的答案。
@InbarRose请更新python 3的答案(stackoverflow.com/a/41708804/828885)
您可以使用string.ascii_letters标识您的非数字:
from string import *
a = 'sd67637 8'
a = a.replace(' ', '')
for i in ascii_letters:
a = a.replace(i, '')
如果要替换冒号,请使用引号"代替冒号'。
那冒号呢?
@ jtlz2,然后使用a = a.replace("",""),请注意引号内的冒号