Как получить положение персонажа в Python? - PullRequest
464 голосов
/ 19 февраля 2010

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

Ответы [ 8 ]

607 голосов
/ 19 февраля 2010

Для этого есть два строковых метода: 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 в случае неудачи. Значения по умолчанию для start и end и интерпретация отрицательных значений такие же, как для срезов.

И

string.index(s, sub[, start[, end]])
Как и find(), но поднимать ValueError, если подстрока не найдена.

101 голосов
/ 26 сентября 2015

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

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

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

46 голосов
/ 19 февраля 2010
>>> 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'
15 голосов
/ 01 июля 2015

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

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

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

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

filename_without_extension = complete_name[:complete_name.rfind('.')]
11 голосов
/ 19 февраля 2010
string.find(character)  
string.index(character)  

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

4 голосов
/ 16 сентября 2018

Символ может появляться несколько раз в строке. Например, в строке sentence позиция e равна 1, 4, 7 (поскольку индексация обычно начинается с нуля). но я обнаружил, что обе функции 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]
0 голосов
/ 09 февраля 2018

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...