在Python中从字符串中删除特定字符

23 浏览
0 Comments

在Python中从字符串中删除特定字符

我正在尝试使用Python从字符串中删除特定的字符。这是我现在使用的代码。不幸的是,它似乎对字符串没有任何影响。

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

如何正确地做到这一点?

admin 更改状态以发布 2023年5月23日
0
0 Comments

我是不是错过了重点,或者只是以下内容:

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"

0
0 Comments

Python中的字符串是不可变的(无法更改)。因此,line.replace(...)的效果只是创建一个新的字符串,而不是更改旧的字符串。您需要重新绑定(赋值)到line,以便该变量获取新值,并删除这些字符。

另外,你所做的方式可能会相对较慢。对于有经验的Python开发人员来说,这可能会有点令人困惑,因为他们会看到一个双重嵌套的结构,并认为正在发生更复杂的事情。

在Python 2.6及更新的Python 2.x版本中 *,您可以使用str.translate

line = line.translate(None, '!@#$')

或正则表达式替换使用re.sub

import re
line = re.sub('[!@#$]', '', line)

方括号中的字符构成字符类。 line中在该类中的任何字符都将被替换为sub的第二个参数:空字符串。

Python 3答案

在Python 3中,字符串是Unicode。您需要做一些不同的转换。 Kevpie在其中一个答案的评论中提到了这一点,并在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.fromkeysmap简洁地生成一个包含以下内容的字典

{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兼容,可以创建一个“空”的转换表来替代None

import string
line = line.translate(string.maketrans('', ''), '!@#$')

这里使用string.maketrans创建一个转换表,它只是一个包含0到255的序数值的字符串。

0