Pythonで文字列の部分文字列を取得するにはどうすればよいですか?

2009年03月20日に質問されました。  ·  閲覧回数 3.1M回  ·  ソース

Joan Venge picture
2009年03月20日

Pythonで文字列を部分文字列化して、3番目の文字から文字列の最後まで新しい文字列を取得する方法はありますか?

たぶんmyString[2:end]

2番目の部分を残すことは「最後まで」を意味し、最初の部分を残す場合、それは最初から始まりますか?

回答

Paolo Bergantino picture
2009年03月20日
3304
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Pythonはこの概念を「スライス」と呼び、文字列だけでなく機能します。 包括的な紹介については、こちら

Endophage picture
2012年03月20日
415

完全を期すために、他の誰もそれについて言及していません。 配列スライスの3番目のパラメーターはステップです。 したがって、文字列を逆にするのは次のように簡単です。

some_string[::-1]

または、代替文字を選択すると、次のようになります。

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

文字列を前後に移動する機能は、スライスを最初または最後から配列できることとの一貫性を維持します。

Michał Leon picture
2012年08月04日
136

Substr()は通常(つまりPHPとPerl)次のように機能します。

s = Substr(s, beginning, LENGTH)

したがって、パラメータはbeginningLENGTHです。

しかし、Pythonの動作は異なります。 開始と終了の後に1つ(!) これは初心者が見つけるのは難しいです。 したがって、Substr(s、beginning、LENGTH)の正しい置換は次のとおりです。

s = s[ beginning : beginning + LENGTH]
codingscientist picture
2012年03月02日
65

これを実現する一般的な方法は、文字列のスライスです。

MyString[a:b]は、インデックスaから(b-1)までの部分文字列を提供します。

gimel picture
2009年03月20日
25

ここでは1つの例が欠落しているようです:完全な(浅い)コピー。

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>

これは、シーケンスタイプのコピー(インターン文字列ではない) [:]を作成するための一般的なイディオムです。 浅いコピーはリストをコピーします

Aaron Hall picture
2017年06月24日
19

Pythonで文字列を部分文字列化して、3番目の文字から文字列の最後まで新しい文字列を取得する方法はありますか?

たぶんmyString[2:end]

はい、これは実際には、名前endを定数シングルトンNone割り当てるか、バインドすると機能します。

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

スライス表記には、次の3つの重要な引数があります。

  • 開始
  • やめる
  • ステップ

指定されていない場合のデフォルトはNoneが、明示的に渡すことができます。

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

2番目の部分を残すことが「最後まで」を意味する場合、最初の部分を残す場合、それは最初から始まりますか?

はい、例:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

スライスに開始を含めますが、停止のみを含め、停止を含めないことに注意してください。

ステップがNone場合、デフォルトでは、スライスはステップに1を使用します。 負の整数でステップする場合、Pythonは最後から最初まで進むのに十分賢いです。

>>> myString[::-1]
'0987654321'

スライス表記の質問への回答説明します。

bouvard picture
2009年03月20日
8

「終わり」を除いて、あなたはそこにそれを持っています。 これはスライス表記と呼ばれます。 あなたの例は読むべきです:

new_sub_string = myString[2:]

2番目のパラメーターを省略すると、暗黙的に文字列の終わりになります。

CopyPasteIt picture
2019年02月17日
7

myStringに、オフセット6で始まり、長さが9のアカウント番号が含まれている場合は、次の方法でアカウント番号を抽出できます: acct = myString[6:][:9]

OPがそれを受け入れた場合、実験的な方法で試してみたいと思うかもしれません。

myString[2:][:999999]

それは機能します-エラーは発生せず、デフォルトの「文字列パディング」は発生しません。

ostrokach picture
2016年08月31日
6

議論に2つのポイントを追加したいと思います。

  1. 空のスペースで代わりにNone使用して、「最初から」または「最後まで」を指定できます。

    'abcde'[2:None] == 'abcde'[2:] == 'cde'
    

    これは、引数として空のスペースを指定できない関数で特に役立ちます。

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
    
  2. Pythonにはスライスオブジェクトがあります:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    
Edson Horacio Junior picture
2020年04月30日
4

さて、PHPスクリプトをPythonに変換する必要があり、 substr(string, beginning, LENGTH)使用法が多かったという状況になりました。
Pythonのstring[beginning:end]を選択した場合、多くのエンドインデックスを計算string[beginning:][:length]を使用する方が簡単で、多くの手間を省くことができました。