繁体   English   中英

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

[英]Replace special characters in a string in Python

我正在使用 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)

一种方法是使用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\\.]

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

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

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

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

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

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

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

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

替换对特定字符串进行操作,因此您需要像这样调用它

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

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

作为旁注,您可能想要寻找BeautifulSoup ,它是一个用于解析凌乱的 HTML 格式文本的库,就像您通常从 scaping 网站获得的一样。

您可以用所需的字符替换特殊字符,如下所示,

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)

翻译似乎更快:

N=100000,30个特殊字符,字符串长度=70

替换:0.3251810073852539 re.sub:0.2859320640563965 翻译:0.12320685386657715

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM