web-dev-qa-db-ja.com

文字列内の特殊文字を置き換えるpython

Urllibを使用してWebサイトからhtmlの文字列を取得し、htmlドキュメント内の各Wordをリストに入れる必要があります。

ここに私がこれまでに持っているコードがあります。エラーが発生し続けます。以下のエラーもコピーしました。

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

str.replaceは、あなたがやりたいことに対して間違った関数です(間違って使用されていることは別として)。セット全体を単一のスペースではなく、セットの任意の文字をスペースに置き換えます(後者がreplaceの役割です)。次のような翻訳を使用できます。

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

これにより、特殊文字のリスト内のすべての文字をスペースにマッピングするマッピングが作成され、文字列でtranslate()が呼び出され、特殊文字のセット内のすべての文字がスペースに置き換えられます。

22
rassahah

1つの方法は、 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

パラメータスタイルについての小さなヒントpython by PEP-8 parameters should be remove_special_charsではなくremoveSpecialChars

また、keepにしたい場合、スペースを変更するだけで[^a-zA-Z0-9 \n\.]から[^a-zA-Z0-9\n\.]

45
Kobi K

文字列変数replaceにある文字を置き換えるため、zではなくstrzを呼び出す必要があります。

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

しかし、replaceは部分文字列を探すため、これは機能しません。ほとんどの場合、正規表現モジュールresub関数と共に使用する必要があります。

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

[]を忘れないでください。これは、置換される文字のセットであることを示しています。

3
Danny M

replaceは特定の文字列で動作するため、次のように呼び出す必要があります。

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

ただし、これはおそらく、必要なものではありません。これは、すべての文字を同じ順序で含む単一の文字列を検索するためです。ダニー・ミショーが指摘したように、正規表現でそれを行うことができます。

補足として、 BeautifulSoup を探すことをお勧めします。これは、通常のWebサイトのスキャッピングから得られるような、乱雑なHTML形式のテキストを解析するためのライブラリです。

2
Pavel

次のように、特殊文字を目的の文字に置き換えることができます。

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