Làm thế nào để có được vị trí của một nhân vật trong Python?


527

Làm thế nào tôi có thể có được vị trí của một nhân vật trong một chuỗi trong python?

Câu trả lời:


697

Có hai phương thức chuỗi cho điều này, find()index(). Sự khác biệt giữa hai là những gì xảy ra khi chuỗi tìm kiếm không được tìm thấy. find()trả lại -1index() tăng lương ValueError.

Sử dụng find()

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

Sử dụng 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

Từ hướng dẫn Python

string.find(s, sub[, start[, end]])
Trả về chỉ số thấp nhất trong s nơi tìm thấy chuỗi con phụ sao cho phụ hoàn toàn được chứa trong đó s[start:end]. Trở -1về thất bại. Mặc định cho bắt đầukết thúc và giải thích các giá trị âm giống như đối với các lát.

Và:

string.index(s, sub[, start[, end]])
Thích find()nhưng tăng ValueErrorkhi không tìm thấy chuỗi con.


127

Để hoàn thiện, nếu bạn cần tìm tất cả các vị trí của một ký tự trong chuỗi, bạn có thể thực hiện như sau:

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

cái nào sẽ trở lại [4, 9]


4
Trong python3, tôi gặp lỗi cú pháp - làm thế nào để sửa đổi điều này?
Sean

19
@Sean: câu lệnh in đã bị xóa. Chỉ còn hình thức chức năng. Khó chịu, nhưng câu trả lời chỉ đơn giản là thay đổi dòng cuối cùng thành: print( [pos for pos, char in enumerate(s) if char == c])
Nate

3
foo = ( [pos for pos, char in enumerate(s) if char == c])sẽ đặt tọa độ foo trong một định dạng danh sách. Tôi thấy điều này thực sự hữu ích
3nrique0

đó là 0 được lập chỉ mục, 0123 so với 1234, vì vậy vị trí thực tế là 5, 10
3kstc

đó có phải là nhanh như nó có thể được? Nếu một người sử dụng np.arrays có thể đạt được hiệu suất cho str dài không?
Seb

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

Cách "dài dòng"

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

để có được chuỗi con,

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

1
Cảm ơn Hãy cho tôi biết làm thế nào chúng ta có thể có được chuỗi con của chuỗi theo các vị trí đã cho ...
user244470

1
@arung: để có được chuỗi con sử dụng cắt: str[from:to]ở đâu fromtolà các chỉ số
Eli Bendersky

s.find () return -1 nếu không tìm thấy chuỗi con
Evgenii

s.search () tăng ValueError khi không tìm thấy chuỗi con. s.find () trả về -1 nếu không tìm thấy chuỗi con.
Praxlistes

16

Để hoàn thành, trong trường hợp tôi muốn tìm phần mở rộng trong tên tệp để kiểm tra, tôi cần tìm '.' Cuối cùng, trong trường hợp này sử dụng rfind:

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

trong trường hợp của tôi, tôi sử dụng cách sau, hoạt động cho dù tên tệp hoàn chỉnh là gì:

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

Điều này rất hữu ích cho việc tìm phạm vi của một chuỗi. Ví dụ: tìm một từ điển có thể là : left = q.find("{"); right = q.rfind("}").
ximiki

15

Điều gì xảy ra khi chuỗi chứa một ký tự trùng lặp? từ kinh nghiệm của tôi với index()tôi đã thấy rằng để nhân đôi, bạn sẽ lấy lại cùng một chỉ mục.

Ví dụ:

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

sẽ trở lại:

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

Trong trường hợp đó bạn có thể làm một cái gì đó như thế:

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

enumeratelà tốt hơn cho loại điều đó.
o11c

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

Có lẽ bạn muốn xem tài liệu để tìm hiểu sự khác biệt giữa hai loại này.


Từ tài liệu được liên kết đó: s.search () tăng ValueError khi không tìm thấy chuỗi con. s.find () trả về -1 nếu không tìm thấy chuỗi con.
Praxlistes

7

Một ký tự có thể xuất hiện nhiều lần trong một chuỗi. Ví dụ: trong một chuỗi sentence, vị trí của e1, 4, 7(vì lập chỉ mục thường bắt đầu từ số không). nhưng những gì tôi tìm thấy là cả hai chức năng find()index()trả về vị trí đầu tiên của một nhân vật. Vì vậy, điều này có thể được giải quyết làm điều này:

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 là một công cụ của bên thứ ba tìm thấy tất cả các chỉ dẫn về các mục thỏa mãn điều kiện.

Ở đây chúng tôi tìm thấy tất cả các vị trí chỉ mục của bức thư "i".

import more_itertools as mit


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

0

Một giải pháp với numpy để truy cập nhanh vào tất cả các chỉ mục:

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

4
Vui lòng không sử dụng phương pháp này. Không có lý do để đưa numpy vào một hoạt động lập chỉ mục chuỗi đơn giản.
Mike Holler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.