Python 如何从字符串中删除标点符号
我一直在做的一个项目是创建一个单词计数器,要做到这一点,我必须有效地删除字符串中的所有标点符号 我曾经尝试过使用split方法和split-at标点符号,但是,这会使列表变得非常奇怪(从在一个单词处分隔到有一个包含5个单词的列表)。然后,我尝试创建一个充满标点符号的列表或字符串,并使用for循环来消除所有标点符号,但都没有成功Python 如何从字符串中删除标点符号,python,Python,我一直在做的一个项目是创建一个单词计数器,要做到这一点,我必须有效地删除字符串中的所有标点符号 我曾经尝试过使用split方法和split-at标点符号,但是,这会使列表变得非常奇怪(从在一个单词处分隔到有一个包含5个单词的列表)。然后,我尝试创建一个充满标点符号的列表或字符串,并使用for循环来消除所有标点符号,但都没有成功 content_string = "This, is a test! to see: whether? or not. the code can eliminate pu
content_string = "This, is a test! to see: whether? or not. the code can eliminate punctuation"
punctuation = list["'", '"', ',', '.', '?', '!', ':', ';', '()']
for i in content_string.lower():
if i in punctuation:
i = i.replace[i," "]
else:
i = i
上面说
“TypeError:'type'对象不可下标”
使用字符串或列表时都会显示此消息。括号和方括号混合使用。
list
和replace
是函数,参数用括号传递
此外,试着用以下文字描述您的算法:
例如:
对于所有被禁止的字符,我想从我的内容中删除它们(替换为空格)
以下是您可以开始使用的实现:
content_string = "This, is a test! to see: whether? or not. the code can eliminate punctuation"
punctuation = ["'", '"', ',', '.', '?', '!', ':', ';', '(', ')']
for i in punctuation:
content_string = content_string.replace(i, " ")
要创建列表,您可以使用
l=[…]
notl=list[…]
,函数/方法(如str.replace
)用括号而不是方括号调用,但是,您可以使用re.sub
以更好、更简单的方式执行此操作:
content_string = "This, is a test! to see: whether? or not. the code can eliminate punctuation"
punctuation = ["'", '"', ',', '.', '?', '!', ':', ';', '(', ')'] # '(', ')' not `()`
import re
new_string = re.sub('|'.join(map(re.escape, punctuation)), '', content_string)
print(new_string)
输出:
This is a test to see whether or not the code can eliminate punctuation
你的错误
"TypeError: 'type' object is not subscriptable"
从生产线出来的
punctuation = list["'", '"', ',', '.', '?', '!', ':', ';', '()']
要定义列表,可以使用括号[]而不使用关键字列表,或者如果使用列表,则必须使用括号(尽管在这种情况下,将列表转换为列表是多余的)
请注意,最后一个元素()
必须拆分为两个元素(
和)
现在,要以有效的方式实现您想要的,请使用条件理解列表
''.join([i if i not in punctuation else ' ' for i in content_string])
结果:
'This is a test to see whether or not the code can eliminate punctuation'
请注意,根据您的代码,您没有删除标点符号,而是将其替换为空格。代码中存在多个错误 第一个:
列表
关键字已过时。
如果您想使用它,则需要添加括号()
,以便对已定义列表中的项目正确执行调用
错误的标点符号=列表[“,”,“,”,“,”,“,”,“?”,“!”,“:”,“;”,“()”]
更好的标点符号=列表([“,”,“,”,“,”,“?”,“!”,“:”,“;”,“()”])
但是简单地用常规的[]
语法定义列表就足够了,而且比list()
调用更有效
第二个:
若我输入标点符号:check,您将无法用替换括号。
这是因为它们是一个两个字符长的字符串,您正在迭代字符串中的单个字符。因此,您将始终将(“
或”)
与”()“
进行比较
一个可能的修复方法是将括号作为单个字符单独添加到标点符号列表中
第三个错误,或者更确切地说是过时的else指令:
else:
i = i
这没有任何意义,您应该跳过else
指令
第四个,最明显的缺陷:
在for循环中,您正在编辑i
变量,该变量是迭代字符串中单个字符的副本。您应该对原始字符串执行更改,这可以通过使用enumerate
来完成-仅当您首先将字符串转换为列表,以便您可以修改其值时
for i, char in enumerate(list(content_string.lower())):
if char in punctuation:
content_string[i] = ' '
无论如何,您试图实现的目标可以归结为一行,使用列表理解和随后生成的列表上的字符串连接:
content\u string=''.join([char if char not in标点符号else''表示content\u string.lower()])
尝试用括号替换中的括号。错误来自第2行的语法错误。检查我的答案,寻找一种解决方案和一种有效的方法,从字符串中删除点刺。这是我向初学者推荐的最简单的解决方案。但是,如果字符串非常大,则效率非常低。@SembeiNorimaki低效?和什么相比?这个简单清晰的解决方案有一百万次的内容:在595毫秒时测试您建议的解决方案(加入
解决方案),相同的内容:17886毫秒。慢30倍…字符串是不可变的,所以内容_字符串[i]='
不起作用。对,我的错。如果您在字符串上调用list(),然后将元素合并回一个字符串,这是可能的。您的列表理解速度非常慢。如果您真的想要高效,请使用string.translate
。在我的经验中,删除一组字符的方法是最快的。我刚刚计时:straightreplace
为2.64µs,str.translate
为1.73µs,''。使用列表理解的join
为29.7µs。设置标点符号
将您的方法提高到8.14µs。在实际应用中,没有区别。
for i, char in enumerate(list(content_string.lower())):
if char in punctuation:
content_string[i] = ' '