如何在Python中从元素列表中删除特殊字符?

12

我有一个元素列表包含特殊字符。 我想将该列表转换为仅包含字母数字字符。 没有特殊字符。 my_list = ["on@3", "two#", "thre%e"]

我的期望输出是,

我有一個元素列表,其中包含特殊字符。我希望將該列表轉換為僅包含字母數字字符,沒有特殊字符。 my_list = ["on@3", "two#", "thre%e"]

我期望的輸出是:

out_list = ["one","two","three"]

我无法简单地对这些项目应用 strip(),请帮忙。


3
编写一个函数,从一个字符串中移除特殊字符,然后使用map或列表推导式将该函数应用于字符串列表。 - Adam Smith
1
on@3中的3去哪了?你也会用字母替换数字吗? - Martijn Pieters
你也没有详细说明其他标点符号怎么办?空格呢?例如,下面的一个答案只保留字母和数字。 - Martijn Pieters
4个回答

15

这里有另一种解决方案:

import re
my_list= ["on@3", "two#", "thre%e"]
print [re.sub('[^a-zA-Z0-9]+', '', _) for _ in my_list]

输出:

['on3', 'two', 'three']

10

使用str.translate()方法将同一翻译表应用于所有字符串:

removetable = str.maketrans('', '', '@#%')
out_list = [s.translate(removetable) for s in my_list]

str.maketrans() 静态方法 是生成翻译映射表的有用工具;前两个参数是空字符串,因为您不是替换字符,而只是删除。第三个字符串包含您要删除的所有字符。

演示:

>>> my_list = ["on@3", "two#", "thre%e"]
>>> removetable = str.maketrans('', '', '@#%')
>>> [s.translate(removetable) for s in my_list]
['on3', 'two', 'three']

1
列表中的第一个字符串将3替换为e - roganjosh
1
@roganjosh:或者输入或输出存在错误。我已经要求对问题进行澄清。请注意,其他答案也没有解决这个问题。 - Martijn Pieters
1
确实是这样,抱歉。我从问题跳到了你的答案,然后跟进了你的链接,没有看到你在问题下面的评论。 - roganjosh

5

试试这个:

l_in = ["on@3", "two#", "thre%e"]
l_out = [''.join(e for e in string if e.isalnum()) for string in l_in]
print l_out
>['on3', 'two', 'three']

2

使用两个for循环

l = ['@','#','%']
out_list = []
for x in my_list:
    for y in l:
        if y in x:
            x = x.replace(y,'')
            out_list.append(x)
            break

使用列表推导式
out_list = [ x.replace(y,'')  for x in my_list for y in l if y in x ]

假设“on@3”中的“3”是一个笔误,输出结果将会是“on@3”,而不是预期的“one”。

谢谢你的解决方案,但这个循环会花费更多时间。 - Pyd
@pyd:你也需要循环去除空格。 - Martijn Pieters
2
另一方面,这里的双重循环有些过度。 - Martijn Pieters
@MartijnPieters 谢谢!如果我要使用列表推导式,那么它也会有同样的问题吗? - Van Peer
1
列表推导式并不会改变循环的次数。它所做的只是使列表构建更加高效。你需要的是一种方法来用单个命令替换所有字符,比如 str.translate(),这样你就只需要一个循环而不是两个了。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接