我正在尝试使用Python从字符串中删除特定字符。这是我现在正在使用的代码。不幸的是它似乎对字符串没有任何作用。
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
我该怎么做呢?
发布于 2018-09-25 14:35:22
Python中的字符串是不可变的(不能更改)。因此,效果line.replace(...)
只是创建一个新字符串,而不是更改旧字符串。您需要重新绑定(赋值)它以line
使该变量获取新值,并删除这些字符。
而且,你这样做的方式相对较慢。对于经验丰富的pythonator来说,这也有点令人困惑,他们会看到一个双重嵌套的结构,并想一想更复杂的事情正在发生。
从Python 2.6和更新的Python 2.x版本*开始,您可以使用str.translate
,(但请继续阅读Python 3的差异):
line = line.translate(None, '!@#$')
或正则表达式替换 re.sub
import re
line = re.sub('[!@#$]', '', line)
括号中的字符构成一个字符类。line
该类中的任何字符都将替换为第二个参数sub
:空字符串。
在Python 3中,字符串是Unicode。你将不得不翻译一点点。kevpie 在其中一个答案的评论中提及这一点,并在文档中str.translate
注明。
调用translate
Unicode字符串的方法时,不能传递我们上面使用的第二个参数。您也不能None
作为第一个参数传递,甚至不能传递string.maketrans
。而是将字典作为唯一参数传递。这个字典将字符的序数值(即调用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 '!@#$'})
*为了与早期的Pythons兼容,您可以创建一个“null”转换表来代替None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
这里string.maketrans
用于创建转换表,它只是一个包含序号值为0到255的字符的字符串。
发布于 2018-09-25 15:10:25
对于仅允许字符串中的某些字符的反向要求,可以使用带有set complement运算符的正则表达式[^ABCabc]
。例如,要删除除ascii字母,数字和连字符之外的所有内容:
>>> import string
>>> import re
>>>
>>> phrase = ' There were "nine" (9) chick-peas in my pocket!!! '
>>> allow = string.letters + string.digits + '-'
>>> re.sub('[^%s]' % allow, '', phrase)
'Therewerenine9chick-peasinmypocket'
可以通过补充该组来匹配不在范围内的字符。如果该组的第一个字符是
'^'
,则将匹配该组中不存在的所有字符。例如,[^5]
将匹配除“5”之外的任何字符,并[^^]
匹配除了之外的任何字符'^'
。^
如果它不是集合中的第一个字符,则没有特殊含义。
https://stackoverflow.com/questions/-100002727
复制相似问题