webdevqa.jp.net

Pythonで文字列をサブストリングする方法

3文字目から文字列の終わりまでの新しい文字列を取得するために、Pythonで文字列をサブストリング化する方法はありますか?

たぶんmyString[2:end]のような?

2番目の部分を離れることが「最後まで」を意味するならば、あなたが最初の部分を離れるならば、それは始めから始まりますか?

1842
Joan Venge
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Pythonはこの概念を「スライス」と呼び、単なる文字列以上のものに対して機能します。包括的な紹介のために ここ を見てください。

2671

他の誰も述べていないように、完全を期して。配列スライスの3番目のパラメータはステップです。そのため、文字列を反転するのは簡単です。

some_string[::-1]

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

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

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

327
Endophage

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

s = Substr(s, beginning, LENGTH)

そのため、パラメータはbeginningLENGTHです。

しかし、Pythonの振る舞いは異なります。開始とENDの後に1つずつ(!)が必要です。 これは初心者が見つけにくいです。 したがって、Substr(s、beginning、LENGTH)の正しい置き換えは、

s = s[ beginning : beginning + LENGTH]
102
Michał Leon

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

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

47
codingscientist

1つの例がここで欠けているようです:フル(浅い)コピー。

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

これは(インターン文字列ではなく)シーケンス型のコピー[:]を作成するための一般的な慣用句です。 Shallowはリストをコピーします。明白な理由もなく使用されているPythonリストスライス構文

17
gimel

3文字目から文字列の終わりまでの新しい文字列を取得するために、Pythonで文字列をサブストリング化する方法はありますか?

たぶんmyString[2:end]のような?

はい、これは実際には、名前endを定数singleton Noneに代入、または bind すると機能します。

>>> 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'

スライスにはstartが含まれていますが、stopまでは含まれていません。

StepがNoneの場合、デフォルトではスライスはステップに1を使用します。あなたが負の整数でステップするならば、Pythonは終わりから始まりまで進むのに十分賢いです。

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

スライス記法について詳しく説明します スライス記法の説明質問に対する私の答え

17
Aaron Hall

あなたはそれを "end"以外のところに持っています。それはスライス記法と呼ばれます。あなたの例は読むべきです:

new_sub_string = myString[2:]

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

8
bouvard

議論に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'
    
6
ostrokach

それはとても簡単です。

s = 'Hello, World!'
print(s[:]) # prints "Hello, World!"
print(s[:5]) # prints Hello
print(s[5:]) # prints , World!
print(s[3:7]) # prints "lo, "
4
Muskovets

たぶん私はそれを逃した、しかし私は変数がここでさらに議論されないのでこのページで元の質問への完全な答えを見つけることができませんでした。それで私は捜し続けなければなりませんでした。

私はまだコメントすることを許されていないので、ここに私の結論を加えましょう。このページにアクセスするときに興味があるのは私だけではなかったと思います。 

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

最初の部分を離れると、 

 >>>myString[:end]
 'Hello' 

そして、もしあなたが:を途中でも残したならば、あなたは5番目の文字となる最も簡単な部分文字列を得ました(0から始まるカウント、従ってこの場合は空白です):

 >>>myString[end]
 ' '
3
Rudi Uhl

ハードコーディングされたインデックスを使うこと自体が面倒です。

それを避けるために、Pythonは組み込みオブジェクトslice()を提供しています。

string = "my company has 1000$ on profit, but I lost 500$ gambling."

私がどれだけのお金を私が残したのか知りたいのなら。

通常の解決策:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

スライスを使う:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

スライスを使うと読みやすくなります。

0
levi

オフセットと長さに基づく部分文字列が必要な場合は、@ CopyPasteltの回答に基づきます。

def substring(s, offset=None, length=None):
    return s[offset:][:length]

使用例

string = 'Hello Beautiful World'
substring(string) #returns 'Hello Beautiful World'
substring(string,length=5) #returns 'Hello'
substring(string,6,9) #returns 'Beautiful'
substring(string,16) #returns 'World'
0
Victor Val

MyStringにオフセット6から始まり長さ9の口座番号が含まれている場合は、この方法で口座番号を抽出できます。acct = myString[6:][:9]

OPがそれを受け入れた場合、彼らは実験的な方法で試してみるとよいでしょう。

myString[2:][:999999]

それは動作します - エラーは発生せず、デフォルトの 'string padding'も発生しません。

0
CopyPasteIt