Wie kann ich die Position eines Zeichens innerhalb einer Zeichenfolge in Python ermitteln?
Wie kann ich die Position eines Zeichens innerhalb einer Zeichenfolge in Python ermitteln?
Antworten:
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
.
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
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 ists[start:end]
. Return-1
on 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,ValueError
wenn der Teilstring nicht gefunden wird.
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]
print( [pos for pos, char in enumerate(s) if char == c])
foo = ( [pos for pos, char in enumerate(s) if char == c])
wird die Koordinaten foo in ein Listenformat setzen. Ich finde das wirklich hilfreich
>>> 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'
str[from:to]
Wo from
und to
sind Indizes
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('.')]
left = q.find("{"); right = q.rfind("}")
.
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
enumerate
ist besser für so etwas.
string.find(character)
string.index(character)
Vielleicht möchten Sie sich die Dokumentation ansehen , um herauszufinden, was der Unterschied zwischen den beiden ist.
Ein Zeichen kann in einer Zeichenfolge mehrmals vorkommen. Zum Beispiel in einer Zeichenkette sentence
, Position e
ist 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]
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]
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')