파이썬에서 문자열의 하위 문자열을 어떻게 얻습니까?


2143

파이썬에서 문자열을 하위 문자열로 묶어 세 번째 문자에서 문자열 끝까지 새로운 문자열을 얻는 방법이 있습니까?

어쩌면 myString[2:end]?

두 번째 부분을 떠나는 것이 '끝까지'를 의미하고 첫 번째 부분을 떠나면 처음부터 시작됩니까?


1
이것은 하나의 명확한 설명을 포함 pythoncentral.io/cutting-and-slicing-strings-in-python
마리오 루이즈

답변:


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

파이썬은이 개념을 "슬라이스"라고 부르며 단순한 문자열 이상에서 작동합니다. 포괄적 인 소개를 보려면 여기 를 살펴보십시오 .


401

아무도 언급하지 않았기 때문에 완전성을 위해. 배열 슬라이스에 대한 세 번째 매개 변수는 단계입니다. 따라서 문자열을 뒤집는 것은 다음과 같이 간단합니다.

some_string[::-1]

또는 대체 문자를 선택하면 다음과 같습니다.

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

문자열을 앞뒤로 이동하는 기능은 슬라이스를 시작 또는 끝에서 배열 할 수 있도록 일관성을 유지합니다.


21
@mtahmed는 절대적으로 질문과 관련이 있습니다. 문자열에서 대체 문자를 선택하여 하위 문자열을 만들려면 어떻게해야합니까? 그것은 my_string [:: 2]이 될 것입니다
Endophage

슬라이스 할 세 번째 매개 변수를 언급하고 싶을 것 같습니다. 문자열에서 다른 모든 문자를 가져와야하는 것은 어딘가에서 중요한 유스 케이스 일 수 있지만 결코 그렇게 할 필요는 없습니다. 자신이 아는 것을 과시하고 싶을 때 문제가있는 것은 아닙니다. 그렇게 할 수 없다면 무엇을 아는 것이 중요합니다. :) 그러나 질문과 관련이있는 경우는 과장되어 있습니다.
존 록우드

1
물론, 대체 문자를 선택하는 구체적인 예는 질문과 관련이 없을 수 있지만, 세 번째 매개 변수가 매우 많이 분할된다는 것을 이해하는 것은 관련이 있으며 간단한 예는 그 작동 방식을 보여줍니다. 파이썬 커뮤니티는 또한 새로운 멤버들에게 친근한 방법으로 교육하는 위대한 역사를 가지고 있습니다 :-)
Endophage

127

Substr ()은 일반적으로 (예 : PHP 및 Perl) 다음과 같이 작동합니다.

s = Substr(s, beginning, LENGTH)

따라서 매개 변수는 beginningLENGTH입니다.

그러나 파이썬의 행동은 다릅니다. END (!) 다음에 시작과 끝이 예상됩니다. 초보자에게는 눈에 잘 띄지 않습니다. 따라서 Substr (s, starting, LENGTH)의 올바른 대체는

s = s[ beginning : beginning + LENGTH]

76
초보자는 다른 언어 습관을 고수하지 말고 파이썬으로 옮길 때 비단 법을 배워야합니다.
Nicu Surdu

3
그리고 완전성을 위해 Java는 String.substring () 메서드가 시작되고 과거가 끝났다는 점에서 Python과 같습니다. 이것은 나를 열심히 깨뜨 렸습니다. 세계의 다른 모든 하위 문자열 함수와 같은 길이라고 생각했습니다.
PhilHibbs

4
그렇게하는 더 파이썬적인 방법은 다음과 같습니다s[beginning:][:length]
victortv

2
PHP와 같은 [더러운 단어] 언어 대신 파이썬으로 시작한 사람으로서, 파이썬은 문자열 [beginning : end]을 사용하여 훨씬 단순하고 직관적이라고 생각합니다. 길이는 일반적으로 관련이 없습니다.
Gloweye

60

이를 달성하는 일반적인 방법은 문자열 슬라이싱입니다.

MyString[a:b] 인덱스 a에서 (b-1)까지의 하위 문자열을 제공합니다.


23

전체 (얕은) 사본 인 한 가지 예가 여기서 누락 된 것 같습니다.

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

이것은 시퀀스 유형의 사본 (인턴 된 문자열이 아님)을 작성하는 데 사용되는 일반적인 관용구입니다 [:]. 얕은 목록을 복사, 명백한 이유없이 사용되는 파이썬 목록 조각 구문을 참조하십시오 .


12
이것은 부분 문자열에 대한 질문과 거의 관련이 없습니다. 문자열에도 적용되지 않습니다. stringA = stringB라고 말하면 충분합니다.
Nicu Surdu

2
[:] 전체 사본은 새 사본을 작성하고 슬라이스 구문을 사용하며 "처음부터 끝까지
서브

2
문자열이 불변이기 때문에 요점은 무엇입니까? a=b충분해야합니다.
bfontaine

1
@ gimel : 사실, [:]불변 유형에서는 전혀 복사하지 않습니다. 하지만 mysequence[:]때 대부분 무해 mysequence같은 불변의 유형 str, tuple, bytes(Py3) 또는 unicode(Py2가), a = b[:]상응하는 것입니다 a = b, 그냥 슬라이싱 바이트 코드 파견 약간의 시간을 낭비하는 얕은 복사 할 때 그것의 의미가 있기 때문에 그 자체를 반환하여에 객체 응답 객체 신원 테스트 외에도 불변의 자기에 대한 다른 참조를 반환하는 것과 같습니다.
ShadowRanger 2016 년

3
이 대답에 대한 다른 비판을 요약하려고합니다. 파이썬에서는 문자열을 변경할 수 없으므로 문자열을 복사 할 이유가 없으므로 전혀 복사 s[:]하지 마십시오 s = 'abc'; s0 = s[:]; assert s is s0. 그렇습니다.리스트가 나올 때까지 파이썬에서 목록을 복사하는 관용적 방법 list.copy이지만 불변 유형의 전체 조각은 변경할 수 없기 때문에 사본을 만들 이유가 없으므로 메모리에 하나만있을 수 있습니다. 우리는 그것을 복사하는 데 시간을 낭비해서는 안됩니다. 이 답변이 잘못되어 질문에 대답조차하지 않기 때문에 삭제해야합니까?
Aaron Hall

18

파이썬에서 문자열을 부분 문자열로 묶어 세 번째 문자에서 문자열 끝까지 새로운 문자열을 얻는 방법이 있습니까?

어쩌면 myString[2:end]?

예, 이름 을 상수 싱글 톤에 할당하거나 바인딩 하면 실제로 작동합니다 .endNone

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

슬라이스 표기법에는 3 가지 중요한 인수가 있습니다.

  • 스타트
  • 중지
  • 단계

제공되지 않을 때의 기본값은 다음과 None같습니다.

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

두 번째 부분을 떠나는 것이 '끝까지'를 의미한다면, 첫 번째 부분을 떠나면 처음부터 시작됩니까?

예, 예를 들면 다음과 같습니다.

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

슬라이스에 start를 포함 시키지만 stop까지는 포함하지 않습니다.

단계가 None이면 기본적으로 슬라이스가 1단계에 사용됩니다. 음의 정수로 밟으면 파이썬은 끝에서 시작으로 갈만큼 똑똑합니다.

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

슬라이스 표기법 질문 설명에 대한 답변 에서 슬라이스 표기법을 자세히 설명합니다.


8

"끝"을 제외하고 바로 거기에 있습니다. 이것을 슬라이스 표기법이라고합니다. 예제는 다음과 같아야합니다.

new_sub_string = myString[2:]

두 번째 매개 변수를 생략하면 암시 적으로 문자열의 끝입니다.


6

토론에 두 가지 요점을 추가하고 싶습니다.

  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. 파이썬은 슬라이스 객체를 가지고 있습니다 :

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'

6

myString에 오프셋 6에서 시작하고 길이가 9 인 계정 번호가있는 경우 다음과 같이 계정 번호를 추출 할 수 있습니다. acct = myString[6:][:9] .

OP가 승인하면 실험적인 방식으로 시도해 볼 수 있습니다.

myString[2:][:999999]

작동합니다-오류가 발생하지 않으며 기본 '문자열 패딩'이 발생하지 않습니다.


1
이 방법을 사용하려면 생각 myString[offset:][:length]당신은 그냥 사용할 수있는 영업 이익의 경우myString[offset:][:]
victortv

1
@VictorVal 정답은 파이썬을 2 차 (3, 4, ...) 프로그래밍 언어로 배우고 언어에 접근하기 위해 익숙한 '구문 갈고리'를 원하는 사람들 (나 같은)을위한 것입니다. 언어 전문가라면 내 대답을 약간 바보로 볼 것입니다.
CopyPasteIt

이와 같은 답변에 삭제 플래그를 지정해야합니까? 다른 답변은 비슷한 솔루션을 훨씬 더 잘 설명하며,이 답변이 몇 분 동안 내 머리와 조회 파이썬을 긁어내어 그 유형의 대답이라는 것을 깨닫기 시작했습니다.
Sebi

3

어쩌면 나는 그것을 놓쳤지만 변수에 대해서는 더 이상 논의하지 않기 때문에이 페이지에서 원래 질문에 대한 완전한 답변을 찾을 수 없었습니다. 검색을 계속해야했습니다.

아직 댓글을 달 수 없으므로 여기에 내 결론을 추가하겠습니다. 이 페이지에 액세스 할 때 관심이있는 유일한 사람은 아니라고 확신합니다.

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

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

첫 번째 부분을 떠나면

 >>>myString[:end]
 'Hello' 

그리고 중간에 :을 남겨두면 가장 간단한 하위 문자열을 얻습니다.이 문자열은 5 번째 문자입니다 (0으로 시작하는 카운트 이므로이 경우 공백입니다).

 >>>myString[end]
 ' '

1

글쎄, PHP 스크립트를 Python으로 변환 해야하는 상황이 있었고 많은 사용법이 substr(string, beginning, LENGTH)있었습니다.
파이썬을 선택했다면 많은 최종 색인 string[beginning:end]을 계산해야 하므로 더 쉬운 방법을 사용 하는 것이 많은 어려움을 겪었습니다.string[beginning:][:length]


0

하드 코딩 된 인덱스 자체를 사용하는 것은 혼란 스러울 수 있습니다.

이를 피하기 위해 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

슬라이스를 사용하면 가독성이 향상됩니다.


5
하드 코딩 된 인덱스가 남아 있고 가독성은 중간 변수에서 비롯되므로 첫 번째 예에서 사용할 수 있기 때문에 이것이 가장 좋은 예는 아닙니다.
ASalazar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.