在Python中去除文本中的标点符号
在Python中去除文本中的标点符号
我正在尝试从一个文本文件中获取单词,并剥离掉所有的标点符号。我尝试了以下代码:
import re with open('hw.txt') as f: lines_after_254 = f.readlines()[254:] sent = [word for line in lines_after_254 for word in line.lower().split()] words = re.sub('[!#?,.:";]', '', sent)
我得到了以下错误:
return _compile(pattern, flags).sub(repl, string, count) TypeError: expected string or buffer
在Python中去除文本中的标点符号是一个常见的需求。标点符号可能会干扰文本的处理和分析,因此需要将其从文本中删除。下面是一个用于去除标点符号的函数remove_puncts()
:
import string translator = str.maketrans('', '', string.punctuation) def remove_puncts(input_string): return input_string.translate(translator)
使用示例:
input_string = """"YH&W^(*D)#IU*DEO)#brhtr<><}{|_}vrthyb,.,''fehsvhrr;[vrht":"]`~!@#$%svbrxs""" remove_puncts(input_string) 'YHWDIUDEObrhtrvrthybfehsvhrrvrhtsvbrxs'
编辑:速度对比
事实证明,使用translator
方法比使用正则表达式进行替换更快。
import re, string, time pattern = '[!#?,.:";]' def regex_sub(input_string): return re.sub(pattern, '', input_string) translator = str.maketrans('', '', string.punctuation) def string_translator(input_string): return input_string.translate(translator) input_string = """cwsx#?;.frvcdr""" string_translator(input_string) regex_sub(input_string) passes = 1000000 t1 = time() for i in range(passes): a = string_translator(input_string) t2 = time() for i in range(passes): a = regex_sub(input_string) t3 = time() string_translator_time = t2 - t1 regex_sub_time = t3 - t2 print(string_translator_time) # 1.341651439666748 print(regex_sub_time) # 3.44773268699646
这段代码比较了使用translator
方法和正则表达式进行替换的速度。通过对比发现,translator
方法更快。
原因是translator
方法使用str.maketrans()
函数创建了一个字符映射表,然后使用translate()
函数将输入字符串中的标点符号替换为空字符串。这种方法的优点是简单高效。
相比之下,使用正则表达式进行替换需要使用re.sub()
函数,并提供一个匹配标点符号的模式。这种方法相对复杂,而且速度较慢。
因此,使用translator
方法是去除文本中标点符号的更好选择。它能够更快速地完成任务,提高代码的执行效率。
在Python中,有时候我们需要从文本中去掉标点符号。然而,有一个问题出现了。原因是我们错误地将re.sub函数应用于了一个列表而不是一个字符串。
具体来说,我们想要使用re.sub函数将字符串中的标点符号替换成空字符,从而去掉它们。但是,我们错误地将这个函数应用于了一个列表。在代码中,我们使用了print语句打印出了结果,但是结果并不是我们期望的。
解决这个问题的方法是将re.sub函数应用于字符串而不是列表。我们需要使用列表推导式来遍历列表中的每个字符串,并将re.sub函数应用于每个字符串。这样,我们就可以正确地去掉标点符号。
下面是正确的代码:
print [re.sub(pattern, '', s) for s in sent]
希望这篇文章对你有帮助!
在Python中去除文本中的标点符号
在Python中,处理文本数据时,经常会遇到需要去除标点符号的情况。标点符号对于文本分析和处理来说通常是没有意义的,因此需要将其去除。
问题的出现原因:
在上述代码中,出现了一些问题。首先,代码将输入的字符串拆分为单个字符,而不是进行分词。其次,在拆分为字符后,才移除特殊字符。这样的处理方式不够高效和准确。
解决方法:
更好的方式是首先读取输入的字符串,然后移除其中的特殊字符,最后再进行分词。这样可以更好地处理文本数据。
代码示例:
import re # 打开输入的文本文件并进行读取 string = open('hw.txt').read() print string # 从读取的字符串中移除特殊字符 no_specials_string = re.sub('[!#?,.:";]', '', string) print no_specials_string # 将文本进行分词,并将单词存储在一个列表中 words = no_specials_string.split() print words
另外,如果想先分词,然后再移除特殊字符,可以使用以下代码:
import re # 打开输入的文本文件并进行读取 string = open('hw.txt').read() print string # 将文本进行分词,并将单词存储在一个列表中 words = string.split() print words # 对列表中的每个单词移除特殊字符 new_words = [re.sub('[!#?,.:";]', '', word) for word in words] print new_words
通过以上代码示例,可以很方便地实现在Python中去除文本中的标点符号的操作。这样的处理可以更好地准备文本数据,以便进行后续的分析和处理。