Pythonを使用して文字列から文字を削除する方法


457

たとえば、文字列があります。EXAMPLE

どうすれば中間の文字を削除できMますか?コードは必要ありません。私は知りたいです:

  • Pythonの文字列は特殊文字で終わりますか?
  • どちらがより良い方法です-中央の文字からすべてを右から左にシフトするか、新しい文字列を作成して中央の文字をコピーしませんか?

回答:


639

Pythonでは、文字列は不変なので、新しい文字列を作成する必要があります。新しい文字列の作成方法にはいくつかのオプションがあります。「M」が表示されている場所から削除したい場合:

newstr = oldstr.replace("M", "")

中心のキャラクターを削除したい場合:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

文字列が特殊文字で終わるかどうか尋ねました。いいえ、あなたはCプログラマのように考えています。Pythonでは、文字列はその長さで格納されるため、などのバイト値を\0文字列に含めることができます。


16
質問者がpythonの真新しいことを考えると、バージョン2.X pythonでは "/"演算子は整数(ゼロに向かって切り捨て)を返しますが、バージョン3.X pythonでは "//"を使用する必要があることに注意してください。代わりに。また、from __future__ import divisionスクリプトの冒頭の行により、バージョン2.Xのpythonはバージョン3.Xのように動作します
Michael Dunn

1
「M」が行の唯一の内容である場合、「」はその場所に空行を残します。
8bitjunkie 2015

1
@ 7SpecialGemsそれはあなたがこの文字列で何をするかに完全に依存します。のような空の文字列""は、空の行を意味しません。リストに入れて改行で結合すると、空の行が作成されますが、それを行わない空の文字列を使用する場所は他にもたくさんあります。
Ned Batchelder、2015

68

これはおそらく最良の方法です:

original = "EXAMPLE"
removed = original.replace("M", "")

文字の移動などを心配する必要はありません。ほとんどのPythonコードは、はるかに高いレベルの抽象化で実行されます。


6
Mユニークではないかもしれません。その場合、これはすべてのを置き換えMますよね?
Lazer、

14
それは正解です。n出現箇所のみを置換する場合は、を使用しますoriginal.replace("M", "", n)
2010

1
@ S.Lott私はそれを修辞的なものと
見なし、

63

特定の位置を置き換えるには:

s = s[:pos] + s[(pos+1):]

特定の文字を置き換えるには:

s = s.replace('M','')

18
これはうまくいくかもしれませんが、部分文字列操作は説明のないPythonの初心者にとって必ずしも理解しにくいので、最初の部分で何が起こっているかを説明することであなたの答えは改善されると思います。
jloubert、2010

したがって、sの長さがの場合l。次に、最初の部分では、posの制約はになりますl-1 > pos >= 0
Haoyu Chen 2015

s [:pos]は0からpos-1までの部分文字列を取得し、s [(pos + 1):]はpos + 1から最後までの部分文字列を取得します。したがって、s [pos]をsから削除します。
s.singh

取り替えられない、それは落ちる。2つの主要な使用例の両方の例を位置選択方法で分けて提供することで、操作を区別するのが良いでしょう。
Alexander Stohr

28

文字列は不変です。しかし、それらを変更可能なリストに変換し、変更後にリストを文字列に戻すことができます。

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

他の人が示したように、既存の文字列から必要な文字以外のすべて取得することで、新しい文字列を作成することもできます。


4
なぜstr.replaceメソッドを使用しないのですか?
alichaudry

12

どうすれば中間の文字、つまりMを削除できますか?

Pythonの文字列は不変なので、できません。

Pythonの文字列は特殊文字で終わりますか?

いいえ。文字のリストに似ています。リストの長さは文字列の長さを定義し、文字はターミネーターとして機能しません。

どちらがより良い方法です-中央の文字からすべてを右から左にシフトするか、新しい文字列を作成して中央の文字をコピーしませんか?

既存の文字列を変更することはできないため、中央の文字を除くすべてを含む新しい文字列を作成する必要があります。


11

次のtranslate()方法を使用します。

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

3
メソッドが変更されました。Pythonの3のためのドキュメントを参照してください:(翻訳)これは、スペースで異なる文字を置き換える(None削除するには動作しないようです):translate( str.maketrans("<>", " ") )
ハンドル

1
:実際には、ドキュメントは、Pythonの3)(変換と異なる文字を削除する2つの方法を指定str.maketrans( "", "", "<>")してstr.maketrans( {"<":None,">":None })
ハンドル

3
答えのコードと同等のもののpython3でこれになりました:'EXAMPLE'.translate({ord("M"): None})
yoniLavi

7

UserString.MutableString

変更可能な方法:

import UserString

s = UserString.MutableString("EXAMPLE")

>>> type(s)
<type 'str'>

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)

3
404 Webサイトインポートなし
何か

6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

文字列から1文字を削除する方法: これは、文字列内の文字として表されるカードのスタックがある例です。それらの1つが描画されます(ランダムな文字をランダムに選択するrandom.choice()関数のランダムモジュールをインポートします)。新しい文字列、cardsLeftは、文字列関数replace()によって指定された残りのカードを保持するために作成されます。最後のパラメーターは、1つの「カード」のみが空の文字列で置き換えられることを示します...


6
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

これはどこか見たことがあります


4

「M」を切り取るために私がしたことは次のとおりです。

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]

2
これはこの特定の文字列のみを処理し、一般的な解決策ではありません。
AndreasBergström18年

3

文字列内の文字を削除/無視したい場合、たとえば、この文字列がある場合、

「[11:L:0]」

Web APIレスポンスなどから、CSVファイルのように、リクエストを使用しているとしましょう

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

ループして不要な文字を削除します。

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

オプションの分割。値を個別に読み取ることができます。

listofvalues = line.split(':')

各値へのアクセスが簡単になりました:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

これは印刷されます

11

L

0


3

a charまたはsub-string onceを削除するには(最初の出現のみ):

main_string = main_string.replace(sub_str, replace_with, 1)

注:ここ1は、置換するint出現回数に応じて任意に置換できます。


3

リスト内包表記を使用できます。

文字列があるとし、文字my name isを削除するとしますm。次のコードを使用します。

"".join([x for x in "my name is" if x is not 'm'])

0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))

2
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
2016年

0

もう1つの方法は、関数を使用することです。

以下は、関数を呼び出すだけで、文字列からすべての母音を削除する方法です

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.