Wie erhalte ich die Position eines Charakters in Python?

527

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

user244470
quelle

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.

Eli Bendersky
quelle
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]

Salvador Dali
quelle
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'
Ghostdog74
quelle
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('.')]
A. Joly
quelle
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
DimSarak
quelle
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.

John Machin
quelle
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]
itssubas
quelle
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]
Pylang
quelle
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')
Seb
quelle
4
Bitte verwenden Sie diese Methode nicht. Es gibt keinen Grund, numpy in eine einfache Indizierungsoperation für Zeichenfolgen einzubeziehen.
Mike Holler