Pythonで文字列から特定の文字を削除する 質問する

Pythonで文字列から特定の文字を削除する 質問する

Python を使用して文字列から特定の文字を削除しようとしています。これは現在使用しているコードです。残念ながら、文字列には何も影響しないようです。

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

これを適切に行うにはどうすればいいでしょうか?


見る文字列メソッド (.replace や .strip など) を呼び出しても文字列が変更 (変化) されないのはなぜですか?このアプローチの何が問題なのかについての具体的なデバッグの質問については、ここでの回答は主に問題の解決方法に焦点を当てています。

ベストアンサー1

Python の文字列は不変です(変更できません)。このため、 の効果は、古い文字列を変更するのではなく、新しい文字列を作成するだけです。その変数に、それらの文字を削除した新しい値を割り当てるには、に再バインドline.replace(...)(割り当て)する必要があります。line

また、あなたが行っている方法は、比較的遅くなります。経験豊富な Python 開発者にとっては、二重にネストされた構造を見て、もっと複雑なことが起こっているのではないかと一瞬考えるなど、少し混乱する可能性もあります。

Python 2.6以降のPython 2.xバージョン*では、代わりに以下を使用できます。str.translate下記のPython 3 の回答を参照):

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

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

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

括弧で囲まれた文字は文字クラスを構成します。そのクラスに含まれる文字は、 の2 番目のパラメータ: の空文字列lineに置き換えられます。sub

Python 3 の回答

Python 3では、文字列はUnicodeです。少し異なる方法で翻訳する必要があります。kevpieはこれについて次のように言及しています。コメント回答の1つに、ドキュメントstr.translate

Unicode文字列のメソッドを呼び出す場合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 との互換性のために、 の代わりに渡す「null」変換テーブルを作成できますNone

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

ここstring.maketrans変換テーブルを作成するために使用されます。変換テーブルは、0 から 255 までの序数値を持つ文字を含む単なる文字列です。

おすすめ記事