- 问题:
-
我尝试使用Python从字符串中删除特定的字符。这就是我现在使用的代码。不幸的是,它似乎对字符串没有任何作用
for char in line:
if char in " ?.!/;:":
line.replace(char,'')我该怎么做?在
- 答案:
-
Python中的字符串是不可变的(不能更改)。因此,
线路。更换(…)
只是创建一个新字符串,而不是更改旧字符串。你需要在代码中加入新的字符而且,你做这件事的方式会比较慢,相对来说。对于经验丰富的Python来说,这也可能会有点困惑,他们会看到一个双重嵌套的结构,并且会想一想有更复杂的事情正在发生
从Python2.6和更新的Python2.x版本*开始,您可以使用
str.translate
,(但请继续阅读Python3的不同之处):line = line.translate(None, '!@#$')
或正则表达式替换为
re.sub
在import re
line = re.sub('[!@#$]', '', line)括号内的字符构成字符类。
行中该类中的任何字符都将替换为
sub
的第二个参数:空字符串在python3中,字符串是Unicode。你得换个角度翻译。kevpie在commenton one of the answers,and it's noted in the
当调用Unicode字符串的
translate
方法时,不能传递上面使用的第二个参数。也不能将None
作为第一个参数传递。相反,您将传递翻译表(通常是字典)作为唯一的参数。此表映射字符的序号值(即调用的结果ord
在它们上面)对应该替换它们的字符的序数值,或者对我们有用的-None
表示应该删除它们所以要用Unicode字符串来完成上面的舞蹈,您可以将其称为
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)这里
dict.fromkeys
以及map
用于简洁地生成包含{ord('!'): None, ord('@'): None, ...}
更简单,比如another answer puts it,就地创建翻译表:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
或创建相同的翻译表
str.maketrans
公司名称:unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
*为了与早期的python兼容,可以创建一个“null”转换表来代替
None
:import string
line = line.translate(string.maketrans('', ''), '!@#$')这里
string.maketrans
em>是一个包含<255个字符的表