замена специальных символов в строке 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:Usersjeremy.KLUGMy DocumentsLiClipse WorkspacePython Project 2Module2.py", line 7, in <module>
    removeSpecialChars = str.replace("!@#$%^&*()[]{};:,./<>?|`~-=_+", " ")
TypeError: replace() takes at least 2 arguments (1 given)

5 ответов


.replace-неправильная функция для того, что вы хотите сделать (кроме того, что она используется неправильно). Вы хотите заменить любой символ набора пробелом, а не весь набор одним пробелом (последний-это то, что делает replace). Вы можете использовать translate следующим образом:

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

это создает отображение, которое сопоставляет каждый символ в вашем списке специальных символов пробелу, а затем вызывает translate () в строке, заменяя каждый символ в наборе специальных символов с пробелом.


один из способов-это использовать 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.побег:

import string
import re

my_str = "hey th~!ere"

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

выход:

hey there

только небольшой совет о стиле параметров в python by PEP-8 параметры должны быть remove_special_chars, а не removeSpecialChars

если вы хотите keep пробелы просто меняются [^a-zA-Z0-9 \n\.] to [^a-zA-Z0-9\n\.]


нужно позвонить replace on z, а не str, так как вы хотите заменить символы, расположенные в строковой переменной z

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

но это не сработает, так как replace ищет подстроку, вам, скорее всего, придется использовать модуль регулярного выражения re С sub функция:

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

не забудьте [], что указывает на то, что это набор символов для замены.


replace работает с определенной строкой, поэтому вам нужно назвать ее так

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

но это наверное не то, что вам нужно, так как это будет выглядеть на одну строку, содержащую все символы в том же порядке. вы можете сделать это с помощью регулярного выражения, как указал Дэнни Мишо.

в качестве примечания, вы можете искать 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)