파이썬에서 캐릭터의 위치를 ​​얻는 방법?


527

파이썬에서 문자열 내부의 문자 위치를 어떻게 얻을 수 있습니까?

답변:


697

이이 두 개의 문자열 방법은, find()하고 index(). 이 둘의 차이점은 검색 문자열을 찾을 수 없을 때 발생하는 것입니다. find()반환 -1index()인상 ValueError.

사용 find()

>>> myString = 'Position of a character'
>>> myString.find('s')
2
>>> myString.find('x')
-1

사용 index()

>>> myString = 'Position of a character'
>>> myString.index('s')
2
>>> myString.index('x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

로부터 파이썬 설명서

string.find(s, sub[, start[, end]])
가장 낮은 인덱스를 반환 문자열 서브 되도록 발견 서브 전부에 포함된다 s[start:end]. -1실패시 반환 . 음수 값의 시작 및 해석에 대한 기본값은 슬라이스와 동일합니다.

과:

string.index(s, sub[, start[, end]])
부분 문자열을 찾을 수 없을 때 처럼 find()올리십시오 ValueError.


127

완전성을 위해 문자열에서 문자의 모든 위치를 찾아야 할 경우 다음을 수행 할 수 있습니다.

s = 'shak#spea#e'
c = '#'
print [pos for pos, char in enumerate(s) if char == c]

이것은 돌아올 것이다 [4, 9]


4
python3에서 구문 오류가 발생합니다-어떻게 수정해야합니까?
Sean

19
@Sean : 인쇄 설명이 제거되었습니다. 함수 형식 만 남아 있습니다. 짜증나지만 그 대답은 단순히 마지막 줄을 다음과 같이 바꾸는 것입니다. print( [pos for pos, char in enumerate(s) if char == c])
Nate

3
foo = ( [pos for pos, char in enumerate(s) if char == c])좌표 foo 를 목록 형식으로 넣습니다 . 나는 발견이 정말 도움이
3nrique0

0과 1234가 아니라 0123이며 실제 위치는 5, 10
3kstc

그게 가능한 한 빠른가요? np.arrays를 사용하면 긴 str에 대한 성능이 향상 될 수 있습니까?

49
>>> s="mystring"
>>> s.index("r")
4
>>> s.find("r")
4

"긴 바람"방법

>>> for i,c in enumerate(s):
...   if "r"==c: print i
...
4

부분 문자열을 얻으려면

>>> s="mystring"
>>> s[4:10]
'ring'

1
감사합니다 주어진 위치에 따라 문자열의 부분 문자열을 얻는 방법을 알려주세요.
user244470

1
@arung : 부분 문자열 사용 슬라이싱을 얻으려면 : str[from:to]위치 fromto인덱스
Eli Bendersky

s.find ()는 부분 문자열을 찾지 못하면 -1을 반환합니다.
Evgenii

하위 문자열을 찾을 수 없으면 s.search ()가 ValueError를 발생시킵니다. 하위 문자열을 찾지 못하면 s.find ()는 -1을 반환합니다.
Praxiteles

16

완료를 위해 파일 이름에서 확장자를 확인하여 확인하려면 마지막 '.'을 찾아야합니다.이 경우 rfind를 사용하십시오.

path = 'toto.titi.tata..xls'
path.find('.')
4
path.rfind('.')
15

필자의 경우 다음을 사용하여 전체 파일 이름이 무엇이든 작동합니다.

filename_without_extension = complete_name[:complete_name.rfind('.')]

이것은 문자열의 범위를 찾는 데 도움이됩니다. 예를 들어 사전을 찾는 것은 다음과 같습니다 left = q.find("{"); right = q.rfind("}").
ximiki

15

문자열에 중복 문자가 포함되면 어떻게됩니까? 내가 경험 한 index()바에 따르면 중복으로 인해 동일한 색인을 얻는다는 것을 알았습니다.

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

s = 'abccde'
for c in s:
    print('%s, %d' % (c, s.index(c)))

돌아올 것이다 :

a, 0
b, 1
c, 2
c, 2
d, 4

이 경우 다음과 같은 작업을 수행 할 수 있습니다.

for i, character in enumerate(my_string):
   # i is the position of the character in the string

enumerate그런 종류의 것이 좋습니다.
o11c

10
string.find(character)  
string.index(character)  

아마도 두 문서 의 차이점이 무엇인지 찾기 위해 문서 를 살펴보고 싶을 것 입니다.


연결된 문서에서 : s.search ()는 부분 문자열을 찾을 수 없을 때 ValueError를 발생시킵니다. 하위 문자열을 찾지 못하면 s.find ()는 -1을 반환합니다.
Praxiteles

7

문자열에 문자가 여러 번 나타날 수 있습니다. 예를 들어 문자열 sentence에서 위치는 e입니다 1, 4, 7(인덱싱은 일반적으로 0에서 시작하기 때문에) 하지만 내가 발견하면 기능을 모두입니다 find()index()문자의 첫 번째 위치를 반환합니다. 따라서이 작업을 수행하면 해결할 수 있습니다.

def charposition(string, char):
    pos = [] #list to store positions for each 'char' in 'string'
    for n in range(len(string)):
        if string[n] == char:
            pos.append(n)
    return pos

s = "sentence"
print(charposition(s, 'e')) 

#Output: [1, 4, 7]

1

more_itertools.locate 조건을 만족하는 항목의 모든 지표를 찾는 타사 도구입니다.

여기서 우리 는 문자의 모든 색인 위치를 찾습니다 "i".

import more_itertools as mit


s = "supercalifragilisticexpialidocious"
list(mit.locate(s, lambda x: x == "i"))
# [8, 13, 15, 18, 23, 26, 30]

0

모든 인덱스에 빠르게 액세스 할 수있는 numpy 솔루션 :

string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')

4
이 방법을 사용하지 마십시오. numpy를 간단한 문자열 인덱싱 작업으로 가져올 이유가 없습니다.
Mike Holler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.