Jak uzyskać pozycję postaci w Pythonie?


Odpowiedzi:


696

Są do tego dwie metody łańcuchowe find()i index(). Różnica między nimi polega na tym, co się dzieje, gdy nie można znaleźć szukanego ciągu. find()zwraca -1 i index()podnosi ValueError.

Za pomocą find()

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

Za pomocą 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

Z podręcznika Python

string.find(s, sub[, start[, end]])
Powrót najniższą indeks s gdzie podciąg sub znajduje się tak, że sub jest całkowicie zawarty w s[start:end]. Zwrot -1w przypadku awarii. Domyślne wartości początku i końca oraz interpretacja wartości ujemnych są takie same jak dla wycinków.

I:

string.index(s, sub[, start[, end]])
Podobnie jak find()podniesienie, ValueErrorgdy nie znaleziono podciągu.


127

Dla kompletności, jeśli chcesz znaleźć wszystkie pozycje znaku w ciągu, możesz wykonać następujące czynności:

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

który wróci [4, 9]


4
W python3 pojawia się błąd składniowy - jak to zmienić?
Sean

19
@Sean: instrukcja print została usunięta. Pozostaje tylko formularz funkcji. Irytujące, ale odpowiedź brzmi: po prostu zmień tę ostatnią linię na: print( [pos for pos, char in enumerate(s) if char == c])
The Nate

3
foo = ( [pos for pos, char in enumerate(s) if char == c])umieści współrzędne foo w formacie listy. Uważam to za bardzo pomocne
3nrique0

jest zindeksowany 0, 0123 w przeciwieństwie do 1234, więc rzeczywista pozycja to 5, 10
3kstc

czy to tak szybko, jak to możliwe? jeśli ktoś użyłby np. tablic, czy mógłby wystąpić wzrost wydajności dla długich str?
Seb

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

„Long Winded” Way

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

uzyskać podciąg,

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

1
Dzięki Powiedz mi, w jaki sposób możemy uzyskać podciąg łańcucha zgodnie z podanymi pozycjami ...
user244470

1
@arung: aby uzyskać podciąg, użyj krojenia: str[from:to]gdzie fromi gdzie tosą indeksy
Eli Bendersky

s.find () zwraca -1, jeśli nie znaleziono podłańcucha
Evgenii,

s.search () podnosi błąd ValueError, gdy nie znaleziono podłańcucha. s.find () zwraca -1, jeśli nie znaleziono podłańcucha.
Praxiteles

16

Na zakończenie, w przypadku, gdy chcę znaleźć rozszerzenie w nazwie pliku, aby to sprawdzić, muszę znaleźć ostatnie „.”, W tym przypadku użyj rfind:

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

w moim przypadku używam następującego, który działa niezależnie od pełnej nazwy pliku:

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

Jest to pomocne w znalezieniu zasięgu ciągu. Na przykład, znalezienie słownika mogą być: left = q.find("{"); right = q.rfind("}").
ximiki,

15

Co dzieje się, gdy ciąg zawiera zduplikowany znak? z mojego doświadczenia z index()zobaczyłem, że za duplikat otrzymujesz ten sam indeks.

Na przykład:

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

wróciłby:

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

W takim przypadku możesz zrobić coś takiego:

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

enumeratejest lepszy do tego rodzaju rzeczy.
o11c

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

Być może chciałbyś rzucić okiem na dokumentację, aby dowiedzieć się, jaka jest różnica między nimi.


Z tej połączonej dokumentacji: s.search () wywołuje błąd ValueError, gdy nie można znaleźć podciągu. s.find () zwraca -1, jeśli nie znaleziono podłańcucha.
Praxiteles

7

Znak może pojawić się wiele razy w ciągu. Na przykład w łańcuchu sentencepozycja ewynosi 1, 4, 7(ponieważ indeksowanie zwykle zaczyna się od zera). ale znalazłem obie funkcje find()i index()zwraca pierwszą pozycję znaku. Można to rozwiązać, wykonując następujące czynności:

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 to narzędzie innej firmy, które znajduje wszystkie oznaki pozycji spełniających warunek.

Tutaj znajdujemy wszystkie lokalizacje indeksu litery "i".

import more_itertools as mit


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

0

Rozwiązanie z numpy zapewniające szybki dostęp do wszystkich indeksów:

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

4
Nie używaj tej metody. Nie ma powodu, aby wprowadzać numpy w prostą operację indeksowania ciągów.
Mike Holler
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.