替换字符串python中的特殊字符

Posted

技术标签:

【中文标题】替换字符串python中的特殊字符【英文标题】:Replace special characters in a string in Python 【发布时间】:2014-07-22 15:56:50 【问题描述】:

我正在使用 urllib 从网站获取一串 html,需要将 html 文档中的每个单词放入一个列表中。

这是我到目前为止的代码。我不断收到错误消息。我也复制了下面的错误。

import urllib.request

url = input("Please enter a URL: ")

z=urllib.request.urlopen(url)
z=str(z.read())
removeSpecialChars = str.replace("!@#$%^&*()[];:,./<>?\|`~-=_+", " ")

words = removeSpecialChars.split()

print ("Words list: ", words[0:20])

这是错误。

Please enter a URL: http://simleyfootball.com
Traceback (most recent call last):
  File "C:\Users\jeremy.KLUG\My Documents\LiClipse Workspace\Python Project 2\Module2.py", line 7, in <module>
    removeSpecialChars = str.replace("!@#$%^&*()[];:,./<>?\|`~-=_+", " ")
TypeError: replace() takes at least 2 arguments (1 given)

【问题讨论】:

【参考方案1】:

您可以将特殊字符替换为所需字符,如下所示,

import string
specialCharacterText = "H#y #@w @re &*)?"
inCharSet = "!@#$%^&*()[];:,./<>?\|`~-=_+\""
outCharSet = "                               " #corresponding characters in inCharSet to be replaced
splCharReplaceList = string.maketrans(inCharSet, outCharSet)
splCharFreeString = specialCharacterText.translate(splCharReplaceList)

【讨论】:

【参考方案2】:

一种方式是使用re.sub,这是我的首选方式。

import re
my_str = "hey th~!ere"
my_new_string = re.sub('[^a-zA-Z0-9 \n\.]', '', my_str)
print my_new_string

输出:

hey there

另一种方式是使用re.escape:

import string
import re

my_str = "hey th~!ere"

chars = re.escape(string.punctuation)
print re.sub(r'['+chars+']', '',my_str)

输出:

hey there

只是一个小提示,PEP-8 在 python 中的参数样式应该是 remove_special_chars 而不是 removeSpecialChars

另外,如果您想保留空格,只需将 [^a-zA-Z0-9 \n\.] 更改为 [^a-zA-Z0-9\n\.]

【讨论】:

+1 显然是它处理每种情况的最快和最好的答案,如果给定奇怪的 utf8 字符,翻译将不会做任何事情,带有负正则表达式 [^...] 的 re.sub 更安全。跨度> 如何使用re.sub替换字符`? 非常有帮助的答案,但在最后一行你不是说使用 [^a-zA-Z0-9\n\.] 会删除空格吗?【参考方案3】:

str.replace 对于您想要做的事情来说是错误的功能(除了它被错误地使用)。您想用空格替换集合中的任何字符,而不是用单个空格替换整个集合(后者是替换的作用)。你可以像这样使用翻译:

removeSpecialChars = z.translate (ord(c): " " for c in "!@#$%^&*()[];:,./<>?\|`~-=_+")

这将创建一个映射,将特殊字符列表中的每个字符映射到一个空格,然后在字符串上调用 translate(),用空格替换特殊字符集中的每个字符。

【讨论】:

你确定正则表达式会比翻译更好吗? translate 可能在内部使用正则表达式? ord 使用做得很好!否则 str.translate 对特殊字符什么都不做。 谢谢!这个答案拯救了我的一天。 请注意,这将替换一组字符中的任何内容,而 this answer 替换任何不在正则表达式匹配中的内容。如果目标是使字符串对于给定上下文“安全”,则后者可能是一种更安全的方法。【参考方案4】:

replace 对特定的字符串进行操作,所以你需要这样调用它

removeSpecialChars = z.replace("!@#$%^&*()[];:,./<>?\|`~-=_+", " ")

但这可能不是您需要的,因为这将查找包含所有字符的单个字符串以相同的顺序。正如 Danny Michaud 指出的那样,您可以使用正则表达式来做到这一点。

附带说明一下,您可能需要查找BeautifulSoup,这是一个用于解析混乱的 HTML 格式文本的库,就像您通常从网页浏览中获得的那样。

【讨论】:

我只需要使用 python 中包含的库。是否有正则表达式可以完成我想做的事情? 这取决于您是否要处理英文文本、包含外来词(带有重音符号、变音符号等)、数字、货币符号等的文本。没有通用的正则表达式来“清除” up stuff",你需要具体说明你需要什么。【参考方案5】:

您需要在z 而不是str 上调用replace,因为您要替换位于字符串变量z 中的字符

removeSpecialChars = z.replace("!@#$%^&*()[];:,./<>?\|`~-=_+", " ")

但这不起作用,因为 replace 查找子字符串,您很可能需要将正则表达式模块 resub 函数一起使用:

import re
removeSpecialChars = re.sub("[!@#$%^&*()[];:,./<>?\|`~-=_+]", " ", z)

不要忘记[],它表示这是一组要替换的字符。

【讨论】:

以上是关于替换字符串python中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

替换python字符串中的特殊字母[重复]

Python - 从键替换特殊字符,字典中的值

python特殊符号的更改,替换

thinkphp中怎样替换字符串

python-参数化-(excel中特殊标识字符替换数据)

lua中怎么替换掉字符串中的$^特殊字符?