Wie erhalte ich die Position eines Charakters in Python?


527

Wie kann ich die Position eines Zeichens innerhalb einer Zeichenfolge in Python ermitteln?

Antworten:


697

Hierfür gibt es zwei Zeichenfolgenmethoden: find()und index(). Der Unterschied zwischen den beiden besteht darin, was passiert, wenn die Suchzeichenfolge nicht gefunden wird. find()kehrt zurück -1 und index()erhöht ValueError.

Verwenden von find()

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

Verwenden von 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

Aus dem Python-Handbuch

string.find(s, sub[, start[, end]])
Geben Sie den niedrigsten Index in s zurück, in dem sich das Teilzeichenfolgen- Sub befindet, sodass das Sub vollständig in enthalten ist s[start:end]. Return -1on Failure. Die Standardeinstellungen für Start und Ende sowie die Interpretation negativer Werte sind dieselben wie für Slices.

Und:

string.index(s, sub[, start[, end]])
Wie, find()aber erhöhen, ValueErrorwenn der Teilstring nicht gefunden wird.


127

Der Vollständigkeit halber können Sie Folgendes tun, wenn Sie alle Positionen eines Zeichens in einer Zeichenfolge finden müssen:

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

welches zurückkehren wird [4, 9]


4
In Python3 erhalte ich einen Syntaxfehler - wie soll dieser geändert werden?
Sean

19
@ Sean: Druckanweisung wurde entfernt. Es bleibt nur die Funktionsform übrig. Irritierend, aber die Antwort ist einfach, diese letzte Zeile zu ändern: 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])wird die Koordinaten foo in ein Listenformat setzen. Ich finde das wirklich hilfreich
3nrique0

Es ist 0 indiziert, 0123 im Gegensatz zu 1234, also ist die tatsächliche Position 5, 10
3kstc

ist das so schnell wie es sein kann? Wenn man np.arrays verwendet, könnte es für lange Zeit einen Leistungsgewinn geben?
Seb

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

"Langatmiger" Weg

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

Teilzeichenfolge zu bekommen,

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

1
Danke Sag mir, wie können wir den Teilstring eines Strings gemäß den angegebenen Positionen erhalten ...
user244470

1
@ Arung: Um den Teilstring zu bekommen, verwenden Sie Slicing: str[from:to]Wo fromund tosind Indizes
Eli Bendersky

s.find () gibt -1 zurück, wenn Teilzeichenfolge nicht gefunden wird
Evgenii

s.search () löst einen ValueError aus, wenn der Teilstring nicht gefunden wird. s.find () gibt -1 zurück, wenn der Teilstring nicht gefunden wird.
Praxiteles

16

Nur zum Abschluss, für den Fall, dass ich die Erweiterung in einem Dateinamen finden möchte, um sie zu überprüfen, muss ich das letzte '.' Finden. In diesem Fall verwenden Sie rfind:

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

In meinem Fall verwende ich Folgendes, was unabhängig vom vollständigen Dateinamen funktioniert:

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

Dies ist hilfreich, um den Umfang einer Zeichenfolge zu ermitteln. Zum Beispiel könnte das Finden eines Wörterbuchs sein : left = q.find("{"); right = q.rfind("}").
Ximiki

15

Was passiert, wenn die Zeichenfolge ein doppeltes Zeichen enthält? Aus meiner Erfahrung mit habe index()ich gesehen, dass Sie für Duplikate den gleichen Index zurückerhalten.

Zum Beispiel:

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

würde zurückkehren:

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

In diesem Fall können Sie so etwas tun:

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

enumerateist besser für so etwas.
o11c

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

Vielleicht möchten Sie sich die Dokumentation ansehen , um herauszufinden, was der Unterschied zwischen den beiden ist.


Aus dieser verknüpften Dokumentation: s.search () löst einen ValueError aus, wenn der Teilstring nicht gefunden wird. s.find () gibt -1 zurück, wenn der Teilstring nicht gefunden wird.
Praxiteles

7

Ein Zeichen kann in einer Zeichenfolge mehrmals vorkommen. Zum Beispiel in einer Zeichenkette sentence, Position eist 1, 4, 7(weil die Indizierung in der Regel von Null beginnt). Was ich aber finde, sind beide Funktionen find()und geben index()die erste Position eines Zeichens zurück. Dies kann also folgendermaßen gelöst werden:

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 ist ein Tool eines Drittanbieters, das alle Angaben zu Elementen findet, die eine Bedingung erfüllen.

Hier finden wir alle Indexpositionen des Briefes "i".

import more_itertools as mit


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

0

Eine Lösung mit numpy für den schnellen Zugriff auf alle Indizes:

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

4
Bitte verwenden Sie diese Methode nicht. Es gibt keinen Grund, numpy in eine einfache Indizierungsoperation für Zeichenfolgen einzubeziehen.
Mike Holler
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.