Как получить положение персонажа в Python?

Как я могу получить позицию символа внутри строки в python?

Ответ 1

Для этого существуют два строковых метода: find() и index(). Разница между ними - это то, что происходит, когда строка поиска не найдена. find() возвращает -1 и index() повышает 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

Из руководства Python

string.find(s, sub[, start[, end]])
Верните наименьший индекс в s, где подстрока sub найден таким образом, что sub полностью содержится в s[start:end]. Верните -1 при ошибке. Значения по умолчанию для начала и конца и интерпретации отрицательных значений такие же, как для срезов.

и

string.index(s, sub[, start[, end]])
Подобно find(), но поднять ValueError, когда подстрока не найдена.

Ответ 2

Просто для полноты, если вам нужно найти все позиции символа в строке, вы можете сделать следующее:

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

который вернет [4, 9]

Ответ 3

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

Ответ 4

Что происходит, когда строка содержит дублирующий символ? по моему опыту с 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

Ответ 5

Просто для завершения, в случае, если я хочу найти расширение в имени файла, чтобы проверить его, мне нужно найти последний ".", в этом случае используйте rfind:

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

в моем случае, я использую следующее, которое работает независимо от полного имени файла:

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

Ответ 6

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

Возможно, вы хотели бы посмотреть документацию, чтобы узнать, какая разница между ними.

Ответ 7

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]