我试图通过使用.isalnum()函数循环遍历单词中的每个字符来从列表中的字符串中删除不需要的特殊符号,并且在某些情况下使用条件为撇号符号添加例外,例如“不能”,“没有”,“不会”。但是对于不需要的情况,它也会保留此符号,例如“”,“”,“ hello”。当符号位于单词中间时,是否有一种方法可以保留?
data_set = "Hello WOrld &()*hello world ////dog /// cat world hello can't "
split_it = data_set.lower().split()
new_word = ''
new_list = list()
for word in split_it:
new_word = ''.join([x for x in word if x.isalnum() or x == " ' "])
new_list.append(new_word)
print(new_list)
['hello','world','hello','world','dog',','cat','world','hello','ca n't']
答案 0 :(得分:3)
如果您知道所有不需要的字符,则可以使用.strip()
仅将它们从开头和结尾删除:
>>> words = "Hello WOrld &()*hello world ////dog /// cat world hello can't ".lower().split()
>>> cleaned_words = [word.strip("&()*/") for word in words]
>>> print(cleaned_words)
['hello', 'world', 'hello', 'world', 'dog', '', 'cat', 'world', 'hello', "can't"]
否则,您可能需要一个正则表达式匹配任何除白名单中的字符之外的其他字符,并固定在字符串的开头或结尾,然后使用re.sub()
删除它们:
>>> import re
>>> nonalnum_at_edge_re = re.compile(r'^[^a-z0-9]+|[^a-z0-9]+$', re.I)
>>> cleaned_words = [re.sub(nonalnum_at_edge_re, '', word) for word in words]
['hello', 'world', 'hello', 'world', 'dog', '', 'cat', 'world', 'hello', "can't"]
答案 1 :(得分:0)
您可以使用正则表达式来匹配不是小写字母或数字的任何字符,并且在其之前(单词的开头)或之后(单词的结尾)都没有这样的字符:< / p>
import re
phrase = "Hello WOrld &()*hello world ////dog /// cat world hello can't "
regex = re.compile(r'(?<![a-z0-9])([^a-z0-9])|([^a-z0-9])(?![a-z0-9])')
print([re.sub(regex, '', word) for word in phrase.lower().split()])
输出:
['hello', 'world', 'hello', 'world', 'dog', '', 'cat', 'world', 'hello', "can't"]