我正在尝试使用Python从字符串中删除特定字符。这就是我现在使用的代码。不幸的是,它似乎没有对字符串做任何事情。
for char in line:
if char in " ?.!/;:":
line.replace(char,'')我该如何正确地做到这一点?
发布于 2010-10-15 11:50:38
Python中的字符串是不可变的(不能更改)。正因为如此,line.replace(...)的作用只是创建一个新字符串,而不是更改旧字符串。您需要将其重新绑定(赋值)到line,以便使该变量获得新值,并删除这些字符。
而且,你做这件事的方式会相对缓慢。这也可能会让有经验的pythonators开发者感到困惑,他们会看到一个双重嵌套的结构,并认为有一些更复杂的东西正在发生。
从Python2.6和更新的Python2.x版本*开始,您可以改为使用str.translate,(参见下面的Python 3 answer ):
line = line.translate(None, '!@#$')或使用re.sub替换正则表达式
import re
line = re.sub('[!@#$]', '', line)括在括号中的字符构成了一个字符类。类中的line中的任何字符都将被sub的第二个参数替换:一个空字符串。
Python 3答案
在Python 3中,字符串是Unicode。你必须用不同的方式来翻译。凯夫派在其中一个答案的comment中提到了这一点,并在documentation for str.translate中提到了这一点。
在调用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 '!@#$'})或者,按照Joseph Lee的建议,使用str.maketrans创建相同的转换表
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))*为了与早期的Python兼容,您可以创建一个"null“转换表来代替None
import string
line = line.translate(string.maketrans('', ''), '!@#$')这里使用string.maketrans创建转换表,转换表只是一个字符串,其中包含序号值从0到255的字符。
发布于 2010-10-15 20:11:54
我是不是错过了这一点,或者仅仅是以下几点:
string = "ab1cd1ef"
string = string.replace("1", "")
print(string)
# result: "abcdef"将其放入循环中:
a = "a!b@c#d$"
b = "!@#$"
for char in b:
a = a.replace(char, "")
print(a)
# result: "abcd"发布于 2010-10-15 12:18:18
>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if c not in '?:!/;' )
'abc#@efg12'https://stackoverflow.com/questions/3939361
复制相似问题