web-dev-qa-db-fra.com

remplacer des caractères spéciaux dans une chaîne python

J'utilise urllib pour obtenir une chaîne de code HTML d'un site Web et je dois mettre chaque mot du document HTML dans une liste.

Voici le code que j'ai jusqu'à présent. Je continue d'avoir une erreur. J'ai également copié l'erreur ci-dessous.

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])

Voici l'erreur.

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)
10
user2363217

str.replace n'est pas la bonne fonction pour ce que vous voulez faire (mis à part qu'elle n'est pas utilisée correctement). Vous voulez remplacer n'importe quel caractère d'un ensemble par un espace, et non l'ensemble d'un seul espace (ce dernier est ce que remplace fait). Vous pouvez utiliser traduire comme ceci:

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

Cela crée un mappage qui mappe chaque caractère de votre liste de caractères spéciaux vers un espace, puis appelle translate () sur la chaîne, en remplaçant chaque caractère du jeu de caractères spéciaux par un espace.

17
rassahah

Une solution consiste à utiliser re.sub , c'est ma méthode préférée.

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

Sortie:

hey there

Une autre méthode consiste à utiliser re.escape :

import string
import re

my_str = "hey th~!ere"

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

Sortie:

hey there

Juste un petit conseil sur le style des paramètres en python par PEP-8 les paramètres devraient être remove_special_chars et non removeSpecialChars

Aussi, si vous voulez garder les espaces, changez simplement [^a-zA-Z0-9 \n\.] en [^a-zA-Z0-9\n\.]

31
Kobi K

Vous devez appeler replace sur z et non pas sur str, car vous souhaitez remplacer les caractères situés dans la variable chaîne z.

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

Mais cela ne fonctionnera pas, étant donné que les propriétés de remplacement d'une sous-chaîne sont remplacées, vous devrez probablement utiliser le module d'expression régulière re avec la fonction sub:

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

N'oubliez pas le [], qui indique qu'il s'agit d'un ensemble de caractères à remplacer.

3
Danny M

replace opère sur une chaîne spécifique, vous devez donc l'appeler ainsi.

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

mais ce n'est probablement pas ce dont vous avez besoin, car cela recherchera une seule chaîne contenant tous ces caractères dans le même ordre. vous pouvez le faire avec une expression rationnelle, comme l'a souligné Danny Michaud.

en guise de remarque, vous voudrez peut-être rechercher BeautifulSoup , qui est une bibliothèque permettant d'analyser du texte désordonné au format HTML, comme ce que vous obtenez habituellement en scapant des sites Web.

2
Pavel

Vous pouvez remplacer les caractères spéciaux par les caractères souhaités comme suit,

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)
0
surendran