1. ホーム
  2. python

[解決済み] Pythonで文字列から特定の文字を削除する

2022-03-15 07:24:16

質問

Pythonを使って、ある文字列から特定の文字を削除しようとしています。これは、私が今使っているコードです。残念ながら、これは文字列に対して何もしていないように見えます。

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

どうすればいいのでしょうか?

どのように解決するのですか?

Pythonの文字列は 不変 (変更できない)。 このため line.replace(...) は、古い文字列を変更するのではなく、新しい文字列を作成するだけです。 そのためには リバインド (に割り当てる。 line という文字を削除して、その変数に新しい値が入るようにします。

また、あなたがやっている方法は、相対的に、ちょっと遅くなりそうです。 二重にネストされた構造を見て、もっと複雑なことが起こっているのだと一瞬思うかもしれません。

Python 2.6 以降のバージョン * では、代わりに次のように使用することができます。 str.translate , ( 見る Python 3 の回答 以下 ):

line = line.translate(None, '!@#$')

または正規表現による置き換えで re.sub

import re
line = re.sub('[!@#$]', '', line)

括弧で囲まれた文字は 文字クラス . の中にある文字は line の2番目のパラメータに置き換えられます。 sub : 空の文字列です。

Python 3 の回答

Python 3では、文字列はUnicodeです。あなたは少し違った方法で翻訳する必要があります。kevpieは、このことについて コメント には、ある回答でそのことが書かれています。 のドキュメントを参照してください。 str.translate .

を呼び出すと translate メソッドを使用する場合、上で使用した 2 番目のパラメータを渡すことはできません。また None を最初のパラメータとします。その代わり、翻訳テーブル(通常は辞書)を唯一のパラメータとして渡します。このテーブルは 序列値 を呼び出した結果です。 ord を、それらを置き換えるべき文字の序数に置き換えるか、あるいは、私たちにとって有用な None というように、削除を指示します。

つまり、Unicode文字列で上記のダンスを行うには、次のようなものを呼び出すことになります。

translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

ここで dict.fromkeys map を含む辞書を簡潔に生成するために使用されます。

{ord('!'): None, ord('@'): None, ...}

もっとシンプルに 別の回答では で、翻訳テーブルをその場で作成します。

unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

あるいは、提起されたように ジョセフ・リー で同じ翻訳テーブルを作成します。 str.maketrans :

unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))


* 以前のPythonとの互換性を保つために、翻訳テーブルを作成して None :

import string
line = line.translate(string.maketrans('', ''), '!@#$')

ここで string.maketrans 翻訳テーブル これは、序数が0から255の文字を含む単なる文字列である。