我试图使用Python从字符串中删除特定字符。这是我现在使用的代码。不幸的是,它似乎对字符串没有做任何事情。
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
我如何正确地做到这一点?
我试图使用Python从字符串中删除特定字符。这是我现在使用的代码。不幸的是,它似乎对字符串没有做任何事情。
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
我如何正确地做到这一点?
当前回答
使用过滤器,你只需要一行
line = filter(lambda char: char not in " ?.!/;:", line)
这将字符串视为可迭代对象,如果lambda返回True,则检查每个字符:
> > >帮助(过滤器) 模块__builtin__中内置函数过滤器的帮助: 过滤器(…) filter(function或None, sequence) ->列表、元组或字符串 返回函数(item)为true的序列项。如果 函数为None,返回为true的项。If sequence是一个元组 或者字符串,返回相同的类型,否则返回一个列表。
其他回答
line = line.translate(None, " ?.!/;:")
#对于目录中的每个文件,重命名文件名
file_list = os.listdir (r"D:\Dev\Python")
for file_name in file_list:
os.rename(file_name, re.sub(r'\d+','',file_name))
我是不是错过了重点,或者仅仅是以下几点:
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"
这是我的Python 2/3兼容版本。因为翻译api已经改变了。
def remove(str_, chars):
"""Removes each char in `chars` from `str_`.
Args:
str_: String to remove characters from
chars: String of to-be removed characters
Returns:
A copy of str_ with `chars` removed
Example:
remove("What?!?: darn;", " ?.!:;") => 'Whatdarn'
"""
try:
# Python2.x
return str_.translate(None, chars)
except TypeError:
# Python 3.x
table = {ord(char): None for char in chars}
return str_.translate(table)
Python中的字符串是不可变的(不能更改)。因此,line.replace(…)的作用只是创建一个新字符串,而不是更改旧字符串。您需要将其重新绑定(赋值)到行,以便使该变量具有新的值,并删除那些字符。
而且,你做的方法相对来说会比较慢。对于有经验的python编程者来说,这也可能会有点困惑,他们会看到一个双嵌套结构,并认为正在发生更复杂的事情。
从Python 2.6和更新的Python 2开始。x版本*,你可以使用str.translate,(见下面的Python 3答案):
line = line.translate(None, '!@#$')
或者用re.sub替换正则表达式
import re
line = re.sub('[!@#$]', '', line)
括号内的字符构成一个字符类。行中属于该类的任何字符都被替换为要sub的第二个参数:空字符串。
Python 3答案
在Python 3中,字符串是Unicode。你得翻译得有点不同。Kevpie在其中一个答案的注释中提到了这一点,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, ...}
甚至更简单,正如另一个答案所说,在适当的地方创建翻译表:
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('', ''), '!@#$')
这里的字符串。Maketrans用于创建一个转换表,它只是一个包含序数为0到255的字符的字符串。