Trích xuất các chữ cái từ chuỗi Python

Chuỗi Python là chuỗi các ký tự riêng lẻ và chia sẻ các phương thức truy cập cơ bản của chúng với các chuỗi Python khác - danh sách và bộ dữ liệu. Cách đơn giản nhất để trích xuất các ký tự đơn từ chuỗi (và các thành viên riêng lẻ từ bất kỳ chuỗi nào) là giải nén chúng thành các biến tương ứng

[trăn]
>>> s = 'Đừng'
>>> s
'Giảng viên đại học'
>>> a, b, c = s # Giải nén thành các biến
>>> một
'D'
>>> b
'o'
>>> c
'N'
[/python]

Thật không may, không phải lúc nào chúng ta cũng có cơ hội biết trước mình sẽ cần bao nhiêu biến để lưu trữ mọi ký tự trong chuỗi. Và nếu số lượng biến chúng tôi cung cấp không khớp với số lượng ký tự trong chuỗi, Python sẽ báo lỗi cho chúng tôi

[trăn]
s = 'Don Quijote'
a, b, c = s
Traceback (cuộc gọi gần đây nhất cuối cùng)
Tệp "", dòng 1, trong
Giá trịError. quá nhiều giá trị để giải nén
[/python]

Truy cập các ký tự trong chuỗi theo chỉ mục trong Python

Thông thường, sẽ hữu ích hơn khi truy cập các ký tự riêng lẻ của chuỗi bằng cách sử dụng cú pháp lập chỉ mục giống như mảng của Python. Ở đây, cũng như với tất cả các trình tự, điều quan trọng cần nhớ là việc lập chỉ mục dựa trên số không;

[trăn]
>>> s = 'Don Quijote'
>>> s[4] # Lấy ký tự thứ 5
'Q'
[/python]

Nếu bạn muốn bắt đầu đếm từ cuối chuỗi, thay vì bắt đầu, hãy sử dụng chỉ số âm. Ví dụ: chỉ số -1 đề cập đến ký tự ngoài cùng bên phải của chuỗi

[trăn]
>>> s[-1]
'e'
>>> s[-7]
'Q'
[/python]

Các chuỗi Python là bất biến, đây chỉ là một cách nói hoa mỹ rằng một khi chúng đã được tạo, bạn không thể thay đổi chúng. Cố gắng làm như vậy sẽ gây ra lỗi

[trăn]
>>> s[7]
'j'
>>> s[7] = 'x'
Traceback (cuộc gọi gần đây nhất cuối cùng)
Tệp "", dòng 1, trong
LoạiLỗi. đối tượng 'str' không hỗ trợ gán mục
[/python]

Nếu bạn muốn sửa đổi một chuỗi, bạn phải tạo nó dưới dạng một chuỗi hoàn toàn mới. Trong thực tế, thật dễ dàng. Chúng tôi sẽ xem xét làm thế nào trong một phút

Cắt chuỗi Python

Trước đó, nếu bạn muốn trích xuất một đoạn gồm nhiều hơn một ký tự, với vị trí và kích thước đã biết thì sao? . Chúng tôi mở rộng cú pháp dấu ngoặc vuông một chút, để chúng tôi có thể chỉ định không chỉ vị trí bắt đầu của phần chúng tôi muốn mà còn cả vị trí kết thúc của phần đó

[trăn]
>>> s[4. số 8]
'Quij'
[/python]

Hãy nhìn vào những gì đang xảy ra ở đây. Giống như trước đây, chúng tôi chỉ định rằng chúng tôi muốn bắt đầu ở vị trí 4 (dựa trên 0) trong chuỗi. Nhưng bây giờ, thay vì hài lòng với một ký tự duy nhất trong chuỗi, chúng tôi nói rằng chúng tôi muốn nhiều ký tự hơn, tối đa nhưng không bao gồm ký tự ở vị trí 8

Bạn có thể nghĩ rằng bạn cũng sẽ có được ký tự ở vị trí 8. Nhưng đó không phải là cách nó hoạt động. Đừng lo lắng - bạn sẽ quen với nó. Nếu nó hữu ích, hãy nghĩ đến chỉ mục thứ hai (chỉ mục sau dấu hai chấm) khi chỉ định ký tự đầu tiên mà bạn không muốn. Ngẫu nhiên, một lợi ích của cơ chế này là bạn có thể nhanh chóng cho biết bạn sắp có bao nhiêu ký tự chỉ bằng cách lấy chỉ số thứ hai trừ đi chỉ số đầu tiên.

Sử dụng cú pháp này, bạn có thể bỏ qua một hoặc cả hai chỉ số. Chỉ mục đầu tiên, nếu bị bỏ qua, sẽ mặc định là 0, do đó đoạn mã của bạn bắt đầu từ đầu chuỗi gốc; . Bỏ qua cả hai chỉ số có thể không được sử dụng nhiều trong thực tế;

[trăn]
>>> s[4. ]
'Quijote' # Trả về từ vị trí 4 đến cuối chuỗi
>>> s[. 4]
'Don' # Quay lại từ đầu về vị trí 3
>>> s[. ]
'Đôn Quijote'
[/python]

Ví dụ, nếu bạn vẫn đang loay hoay tìm hiểu sự thật rằng, s[0. 8] trả về mọi thứ cho đến, nhưng không bao gồm, ký tự ở vị trí 8, điều này có thể hữu ích nếu bạn suy nghĩ một chút về ký tự này. đối với bất kỳ giá trị nào của chỉ mục, n, mà bạn chọn, giá trị của s[:n] + s[n:] sẽ luôn giống với chuỗi mục tiêu ban đầu. Nếu cơ chế lập chỉ mục bao gồm, ký tự ở vị trí n sẽ xuất hiện hai lần

[trăn]
>>> s[6]
'tôi'
>>> s[. 6] + s[6. ]
'Đôn Quijote'
[/python]

Cũng giống như trước đây, bạn có thể sử dụng số âm làm chỉ số, trong trường hợp đó, việc đếm bắt đầu ở cuối chuỗi (với chỉ số -1) thay vì ở đầu

[trăn]
>>> s[-7. -3]
'Quij'
[/python]

Bỏ qua ký tự trong khi tách chuỗi Python

Biến thể cuối cùng của cú pháp dấu ngoặc vuông là thêm tham số thứ ba, tham số này chỉ định 'sải bước' hoặc số lượng ký tự bạn muốn di chuyển về phía trước sau khi mỗi ký tự được truy xuất từ ​​chuỗi gốc. Ký tự được truy xuất đầu tiên luôn tương ứng với chỉ mục trước dấu hai chấm; . Và cứ tiếp tục như vậy cho đến khi đạt hoặc vượt quá chỉ số kết thúc. Nếu, như trong các trường hợp chúng ta đã gặp cho đến nay, tham số bị bỏ qua, nó sẽ mặc định là 1, do đó mọi ký tự trong đoạn được chỉ định đều được truy xuất. Một ví dụ làm cho điều này rõ ràng hơn

[trăn]
>>> s[4. số 8]
'Quij'
>>> s[4. 8. 1] # 1 dù sao cũng là giá trị mặc định, vì vậy kết quả tương tự
'Quij'
>>> s[4. 8. 2] # Trả về một ký tự, sau đó di chuyển về phía trước 2 vị trí, v.v.
'Qi' # Khá thú vị
[/python]

Bạn cũng có thể chỉ định một bước tiến tiêu cực. Như bạn có thể mong đợi, điều này cho thấy rằng bạn muốn Python quay ngược lại khi truy xuất các ký tự

[trăn]
>>> s[8. 4. -1]
'ojiu'
[/python]

Như bạn có thể thấy, vì chúng ta đang quay ngược lại, nên chỉ số bắt đầu cao hơn chỉ số kết thúc là hợp lý (nếu không sẽ không có gì được trả về)

[trăn]
>>> s[4. 8. -1]
''
[/python]

Vì lý do đó, nếu bạn chỉ định một bước tiến âm, nhưng bỏ qua chỉ mục thứ nhất hoặc thứ hai, Python sẽ mặc định giá trị bị thiếu thành bất kỳ giá trị nào hợp lý trong các trường hợp. chỉ mục bắt đầu đến cuối chuỗi và chỉ mục kết thúc đến đầu chuỗi. Tôi biết, nó có thể khiến bạn đau đầu khi nghĩ về nó, nhưng Python biết nó đang làm gì

[trăn]
>>> s[4. -1] # Chỉ mục kết thúc mặc định là đầu chuỗi
'Q không có'
>>> s[. 4. -1] # Chỉ mục bắt đầu mặc định ở cuối chuỗi
'etojiu'
[/python]

Vì vậy, đó là cú pháp dấu ngoặc vuông, cho phép bạn truy xuất các đoạn ký tự nếu bạn biết chính xác vị trí của đoạn bạn cần trong chuỗi

Nhưng nếu bạn muốn truy xuất một đoạn dựa trên nội dung của chuỗi mà chúng ta có thể không biết trước thì sao?

Kiểm tra nội dung

Python cung cấp các phương thức chuỗi cho phép chúng ta cắt một chuỗi theo các dấu phân cách mà chúng ta có thể chỉ định. Nói cách khác, chúng ta có thể yêu cầu Python tìm một chuỗi con nhất định trong chuỗi mục tiêu của mình và chia chuỗi mục tiêu xung quanh chuỗi con đó. Nó thực hiện điều đó bằng cách trả về một danh sách các chuỗi con kết quả (trừ các dấu phân cách). Nhân tiện, chúng ta có thể chọn không chỉ định rõ ràng dấu phân cách, trong trường hợp đó, dấu phân cách mặc định là ký tự khoảng trắng (dấu cách, '\t', '\n', '\r', '\f') hoặc chuỗi

Hãy nhớ rằng các phương thức này không ảnh hưởng đến chuỗi mà bạn gọi chúng;

[trăn]
>>> s. tách ra()
['Don', 'Quijote']
>>> s
'Don Quijote' # s không bị thay đổi
[/python]

Hữu ích hơn, chúng ta có thể thu thập danh sách trả về trực tiếp vào các biến thích hợp

[trăn]
>>> tiêu đề, xử lý = s. tách ra()
>>> tiêu đề
'Giảng viên đại học'
>>> xử lý
'Quijote'
[/python]

Để anh hùng người Tây Ban Nha của chúng ta lại với những chiếc cối xay gió của anh ấy một lát, hãy tưởng tượng rằng chúng ta có một chuỗi chứa thời gian của đồng hồ tính bằng giờ, phút và giây, được phân định bằng dấu hai chấm. Trong trường hợp này, chúng ta có thể hợp lý tập hợp các phần riêng biệt thành các biến để thao tác thêm

[trăn]
>>>tim='16. 30. 10'
>>> giờ, phút, giây = tim. tách ra('. ')
>>> giờ
'16'
>>> phút
'30'
>>> giây
'10'
[/python]

Chúng tôi có thể chỉ muốn tách chuỗi mục tiêu một lần, bất kể bao nhiêu lần dấu phân cách xảy ra. Phương thức split() sẽ chấp nhận tham số thứ hai chỉ định số lần phân tách tối đa để thực hiện

[trăn]
>>> tim. tách ra('. ', 1) # split() chỉ một lần
['16', '30. 10']
[/python]

Ở đây, chuỗi được tách ra trên dấu hai chấm đầu tiên và phần còn lại được giữ nguyên. Và nếu chúng ta muốn Python bắt đầu tìm kiếm các dấu phân cách từ đầu kia của chuỗi?

[trăn]
>>> tim. rsplit('. ', 1)
['16. 30', '10']
[/python]

Xây dựng một phân vùng

Một phương thức chuỗi tương tự là partition(). Điều này cũng phân tách một chuỗi dựa trên nội dung, sự khác biệt là kết quả là một tuple và nó giữ nguyên dấu phân cách, cùng với hai phần của chuỗi đích ở hai bên của nó. Không giống như split(), partition() luôn chỉ thực hiện một thao tác tách, bất kể dấu phân cách xuất hiện bao nhiêu lần trong chuỗi mục tiêu

[trăn]
>>>tim='16. 30. 10'
>>> tim. vách ngăn('. ')
('16', '. ', '30. 10')
[/python]

Như với phương pháp split(), có một biến thể của partition(), rpartition(), bắt đầu tìm kiếm các dấu phân cách từ đầu kia của chuỗi mục tiêu

[trăn]
>>> tim. phân vùng ('. ')
('16. 30', '. ', '10')
[/python]

Sử dụng chuỗi của Python. thay thế()

Bây giờ, trở lại với Don Quijote của chúng ta. Trước đó, khi chúng tôi cố gắng Anh hóa tên của anh ấy bằng cách thay đổi 'j' thành 'x' bằng cách gán 'x' trực tiếp cho split()0, chúng tôi nhận thấy rằng chúng tôi không thể làm điều đó vì bạn không thể thay đổi các chuỗi Python hiện có. Nhưng chúng ta có thể giải quyết vấn đề này bằng cách tạo một chuỗi mới theo ý thích của chúng ta hơn, dựa trên chuỗi cũ. Phương thức chuỗi cho phép chúng ta làm điều này là split()1

[trăn]
>>> s. thay thế ('j', 'x')
'Don Quixote'
>>> s
'Don Quijote' # s không bị thay đổi
[/python]

Một lần nữa, chuỗi của chúng tôi đã không được thay đổi ở tất cả. Điều đã xảy ra là Python chỉ đơn giản trả về một chuỗi mới theo hướng dẫn mà chúng tôi đã đưa ra, sau đó loại bỏ nó ngay lập tức, để lại chuỗi ban đầu của chúng tôi không thay đổi. Để duy trì chuỗi mới của chúng tôi, chúng tôi cần gán nó cho một biến

[trăn]
>>> new_s = s. thay thế ('j', 'x')
>>> s
'Đôn Quijote'
>>> new_s
'Don Quixote'
[/python]

Nhưng tất nhiên, thay vì giới thiệu một biến mới, chúng ta chỉ có thể sử dụng lại biến hiện có

[trăn]
>>> s = s. thay thế ('j', 'x')
>>> s
'Don Quixote'
[/python]

Và ở đây, mặc dù có vẻ như chúng ta đã thay đổi chuỗi ban đầu, nhưng trên thực tế, chúng ta vừa loại bỏ nó và lưu trữ một chuỗi mới vào vị trí của nó

Lưu ý rằng, theo mặc định, split()1 sẽ thay thế mọi lần xuất hiện của chuỗi con tìm kiếm bằng chuỗi con mới

[trăn]
>>> s = 'Don Quijote'
>>> s. thay thế ('o', 'a')
'Đan Quijate'
[/python]

Chúng tôi có thể kiểm soát sự quá mức này bằng cách thêm một tham số bổ sung chỉ định số lần tối đa mà chuỗi con tìm kiếm sẽ được thay thế

[trăn]
>>> s. thay thế ('o', 'a', 1)
'Dan Quijote'
[/python]

Cuối cùng, phương thức thay thế () không giới hạn hoạt động trên các ký tự đơn lẻ. Chúng ta có thể thay thế toàn bộ đoạn của chuỗi mục tiêu bằng một số giá trị được chỉ định