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?
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:
Có hai phương thức chuỗi cho điều này, find()
và 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 -1
vàindex()
tăng lương 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]])
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ở-1
về thất bại. Mặc định cho bắt đầu và kế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íchfind()
nhưng tăngValueError
khi không tìm thấy chuỗi con.
Để 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]
print( [pos for pos, char in enumerate(s) if char == c])
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
>>> 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'
str[from:to]
ở đâu from
và to
là các chỉ số
Để 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('.')]
left = q.find("{"); right = q.rfind("}")
.
Đ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
enumerate
là tốt hơn cho loại điều đó.
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.
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 e
là 1, 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()
và 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]
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]
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')