首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中移除字符串中的特定字符

在Python中移除字符串中的特定字符
EN

Stack Overflow用户
提问于 2010-10-15 11:46:21
回答 25查看 1.6M关注 0票数 650

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

代码语言:javascript
复制
for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

我该如何正确地做到这一点?

EN

回答 25

Stack Overflow用户

回答已采纳

发布于 2010-10-15 11:50:38

Python中的字符串是不可变的(不能更改)。正因为如此,line.replace(...)的作用只是创建一个新字符串,而不是更改旧字符串。您需要将其重新绑定(赋值)到line,以便使该变量获得新值,并删除这些字符。

而且,你做这件事的方式会相对缓慢。这也可能会让有经验的pythonators开发者感到困惑,他们会看到一个双重嵌套的结构,并认为有一些更复杂的东西正在发生。

从Python2.6和更新的Python2.x版本*开始,您可以改为使用str.translate,(参见下面的Python 3 answer ):

代码语言:javascript
复制
line = line.translate(None, '!@#$')

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

代码语言:javascript
复制
import re
line = re.sub('[!@#$]', '', line)

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

Python 3答案

在Python 3中,字符串是Unicode。你必须用不同的方式来翻译。凯夫派在其中一个答案的comment中提到了这一点,并在documentation for str.translate中提到了这一点。

在调用Unicode字符串的translate方法时,不能传递上面使用的第二个参数。您也不能将None作为第一个参数传递。相反,您需要传递一个转换表(通常是一个字典)作为唯一的参数。此表将字符的序数值(即,对字符调用ord的结果)映射到应替换它们的字符的序数值,或者-对我们有用-None,以指示应删除它们。

因此,要使用Unicode字符串执行上述操作,您可以调用如下代码

代码语言:javascript
复制
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

这里使用dict.fromkeysmap简洁地生成包含以下内容的字典

代码语言:javascript
复制
{ord('!'): None, ord('@'): None, ...}

更简单的是,作为another answer puts it,就地创建转换表:

代码语言:javascript
复制
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

或者,按照Joseph Lee的建议,使用str.maketrans创建相同的转换表

代码语言:javascript
复制
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))

*为了与早期的Python兼容,您可以创建一个"null“转换表来代替None

代码语言:javascript
复制
import string
line = line.translate(string.maketrans('', ''), '!@#$')

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

票数 720
EN

Stack Overflow用户

发布于 2010-10-15 20:11:54

我是不是错过了这一点,或者仅仅是以下几点:

代码语言:javascript
复制
string = "ab1cd1ef"
string = string.replace("1", "") 

print(string)
# result: "abcdef"

将其放入循环中:

代码语言:javascript
复制
a = "a!b@c#d$"
b = "!@#$"
for char in b:
    a = a.replace(char, "")

print(a)
# result: "abcd"
票数 299
EN

Stack Overflow用户

发布于 2010-10-15 12:18:18

代码语言:javascript
复制
>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'
票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3939361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档