wake-up-neo.com

sonderzeichen in einem String-Python ersetzen

Ich verwende urllib, um eine HTML-Zeichenfolge von einer Website zu erhalten, und muss jedes Word im HTML-Dokument in eine Liste aufnehmen.

Hier ist der Code, den ich bis jetzt habe. Ich bekomme immer einen Fehler. Ich habe auch den Fehler unten kopiert.

import urllib.request

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

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

words = removeSpecialChars.split()

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

Hier ist der Fehler.

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("[email protected]#$%^&*()[]{};:,./<>?\|`~-=_+", " ")
TypeError: replace() takes at least 2 arguments (1 given)
10
user2363217

str.replace ist die falsche Funktion für das, was Sie tun möchten (abgesehen davon, dass es falsch verwendet wird). Sie möchten jedes Zeichen einer Menge durch ein Leerzeichen ersetzen, nicht die gesamte Menge durch ein einzelnes Leerzeichen (letzteres ist das, was Ersetzen tut). Sie können wie folgt übersetzen:

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

Dadurch wird eine Zuordnung erstellt, die jedes Zeichen in Ihrer Liste der Sonderzeichen einem Leerzeichen zuordnet und dann translate () für die Zeichenfolge aufruft, wobei jedes einzelne Zeichen in der Menge der Sonderzeichen durch ein Leerzeichen ersetzt wird.

17
rassahah

Eine Möglichkeit ist die Verwendung von re , das ist meine bevorzugte Methode.

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

Ausgabe:

hey there

Eine andere Möglichkeit ist die Verwendung von re.escape :

import string
import re

my_str = "hey th~!ere"

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

Ausgabe:

hey there

Nur ein kleiner Tipp über Parameterstil in Python von PEP-8 Parameter sollten remove_special_chars sein und nicht removeSpecialChars

Wenn Sie behalten die Leerzeichen ändern möchten, ändern Sie einfach [^a-zA-Z0-9 \n\.] in [^a-zA-Z0-9\n\.].

31
Kobi K

Sie müssen replace für z und nicht für str aufrufen, da Sie Zeichen ersetzen möchten, die sich in der Zeichenfolgenvariablen z befinden.

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

Dies funktioniert jedoch nicht, da beim Ersetzen nach einer Teilzeichenfolge wahrscheinlich das Modul re des regulären Ausdrucks mit der Funktion sub verwendet werden muss:

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

Vergessen Sie nicht den [], der darauf hinweist, dass es sich um einen Satz von zu ersetzenden Zeichen handelt.

3
Danny M

replace wirkt sich auf eine bestimmte Zeichenfolge aus, daher müssen Sie sie so nennen

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

dies ist jedoch wahrscheinlich nicht das, was Sie brauchen, da dies nach einer einzelnen Zeichenfolge sucht, die alle diese Zeichen in derselben Reihenfolge enthält. Sie können es mit einem Regex tun, wie Danny Michaud darauf hingewiesen hat.

als Randnotiz möchten Sie vielleicht nach BeautifulSoup suchen, einer Bibliothek zum Analysieren von unordentlichem HTML-formatiertem Text, wie Sie ihn normalerweise von Websites erhalten.

2
Pavel

Sie können die Sonderzeichen wie folgt durch die gewünschten Zeichen ersetzen.

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