Làm cách nào để tìm kiếm một mẫu trong tệp văn bản bằng python?

Hai công thức đầu tiên của chúng tôi tập trung chủ yếu vào cách mở một hoặc nhiều tệp và lặp qua từng dòng một. Mặc dù chúng tôi đã chú ý một chút đến cách chúng tôi có thể tìm kiếm các mẫu bằng cách sử dụng , nhưng chúng tôi đã không cố gắng làm gì nhiều với những gì chúng tôi bắt được. Chết tiệt, chúng tôi thậm chí đã không cố gắng hết sức để viết một biểu thức chính quy tốt

Nhưng khi bạn bắt đầu nghiêm túc tìm kiếm các mẫu trong văn bản, một trong những mục tiêu rõ ràng là chọn ra và thu thập các kết quả phù hợp của bạn. Có thể bạn muốn kéo tất cả các số điện thoại ra khỏi các khối văn bản lớn. Hoặc địa chỉ email. Hoặc bất cứ điều gì đặt trong dấu ngoặc kép. Sao cũng được

Đây là một cách để thử nó

Nhưng trước khi chúng ta bắt đầu, hãy để tôi nói rằng tôi sẽ cho rằng bạn đã đọc vài công thức nấu ăn đầu tiên và sẽ không làm việc quá chăm chỉ để giải thích những thứ được đề cập ở đó. Và hãy nhớ rằng tổ hợp phím của tôi đang đến ngay từ máy tính ở nhà của tôi, chạy Ubuntu Linux. Tôi sẽ cố gắng cung cấp các bản dịch Mac và Windows khi chúng tôi thực hiện, nhưng tôi có thể nhầm lẫn một âm vị ở đây và ở đó. Nếu bất cứ điều gì bị hỏng và không hoạt động ở phía bạn, chỉ cần gửi email cho tôi hoặc gửi nhận xét. Chúng tôi sẽ ủi nó ra

Bỏ qua các thủ tục, đây là nhiệm vụ ví dụ mà tôi đã chọn để đạt được sứ mệnh của mình

  1. Tải xuống phiên bản King James của Kinh thánh
  2. Đọc qua từng dòng văn bản
  3. Nắm bắt từng từ có bốn chữ cái
  4. In chúng ra

Hãy làm nó

1. Mở dòng lệnh, tạo một thư mục làm việc, di chuyển đến đó

Chúng ta sẽ bắt đầu giống như cách chúng ta đã làm trong hai bài học đầu tiên, tạo một thư mục làm việc cho tất cả các tệp của chúng ta và chuyển sang dòng lệnh của chúng ta

cd Documents/
mkdir py-search-and-capture
cd py-search-and-capture/

Các lệnh sẽ hoạt động dễ dàng trong Mac cũng như trong Linux. Nếu bạn đang làm việc trong Windows, bạn sẽ ở trên "C. /" thay vì cấu trúc kiểu Unix ở trên. Vì vậy, bạn có thể "mkdir" một thư mục làm việc mới trong "C. /TEMP" hoặc bất cứ nơi nào khác mà bạn muốn làm việc. Hoặc chỉ cần tạo một thư mục ở bất cứ đâu thông qua Windows Explorer và "cd" ở đó sau khi thực tế thông qua dòng lệnh

2. Tải xuống tệp nguồn của chúng tôi, Phiên bản King James của Kinh thánh

Chúng tôi sẽ sử dụng tệp văn bản do Project Gutenberg cung cấp làm nguồn của chúng tôi. Như trong các bài học trước, tôi sẽ sử dụng tiện ích dòng lệnh curl để truy xuất tệp, nhưng bạn có thể tải tệp xuống thư mục làm việc của chúng tôi bằng trình duyệt web nếu muốn.

curl -O //www.gutenberg.org/dirs/etext92/bible11.txt

3. Tạo tập lệnh python của chúng tôi trong trình soạn thảo văn bản bạn chọn

vim search.py

Dòng trên, một lần nữa sẽ hoạt động với Linux hoặc Mac, sẽ mở một tệp mới trong vim, trình soạn thảo văn bản dòng lệnh mà tôi thích hơn. Bạn có thể làm theo hoặc thoải mái tạo tệp của riêng mình trong ứng dụng bạn thích. Nếu bạn là người dùng Windows mới, Notepad sẽ hoạt động tốt

Nếu bạn đang theo dõi trong vim, bạn sẽ cần nhập "chế độ chèn" để có thể bắt đầu nhập văn bản. Làm điều đó bằng cách đánh

i

4. Viết mã

#!/usr/bin/env python
import re

bible = open["kjv10.txt", "r"]
regex = re.compile[r'\b\w{4}\b']

for line in bible:
    four_letter_words = regex.findall[line]
    for word in four_letter_words:
        print word

Tệp của chúng tôi mở bằng cách nhập mô-đun re, mô-đun này sẽ cho phép chúng tôi gọi thư viện biểu thức chính quy của Python. Sau đó, chúng tôi mở Kinh thánh của mình thành một biến cùng tên và, như trong các công thức trước, mở một vòng lặp sẽ lặp qua từng dòng trong tệp

Các công cụ mới đến tiếp theo. Câu lệnh đầu tiên phía trên vòng lặp của chúng ta sử dụng phương thức biên dịch lại để lưu mẫu biểu thức chính quy của chúng ta vào một biến có tên là "regex. " [Như người bình luận Paddy đã đề xuất, bạn nên đặt nó ở trên vòng lặp để không phải lặp lại trong mỗi lần lặp. ] Hãy nhớ rằng, mục tiêu của chúng ta là ghép các từ có bốn chữ cái bất kỳ. Có ba biểu tượng regex tôi đã ghép lại với nhau để hack nó. Chúng được định nghĩa như sau. Tôi đã rút ra các định nghĩa từ tài liệu tham khảo Python, điều này có thể giúp bạn giải quyết hầu hết các vấn đề

  • \b - Ranh giới từ. Đây là xác nhận có độ rộng bằng 0 chỉ khớp ở đầu hoặc cuối từ
  • \w - Khớp bất kỳ ký tự chữ và số nào
  • {m,n} - Phải có ít nhất m lần lặp lại và nhiều nhất là n

Vì vậy, khi bạn ghép chúng lại với nhau như vậy, "\b\w{4}\b", thứ bạn đang yêu cầu là bất kỳ khoảng bốn ký tự chữ và số nào giữa hai ranh giới từ. Có lý?

Tiếp theo, được trang bị với biểu thức chính quy của chúng tôi, chúng tôi tạo một biến khác gọi là "four_letter_words. " Trong đó, chúng ta thấy biến regex của mình được ép vào một phương thức re mà chúng ta chưa từng sử dụng trước đây. Trong các bài học trước, chúng ta đã sử dụng hàm kludgy match[] để tạo các cú đánh. Ở đây chúng tôi đang sử dụng một cái gì đó thanh lịch hơn. Đó là findall[], sẽ trả về tất cả các kết quả phù hợp trong dòng của chúng tôi dưới dạng danh sách. Và bằng cách kết nối nó với biến "regex" được biên dịch trước của chúng tôi, chúng tôi đang đặt biến đó làm mẫu mà nó sẽ tìm kiếm

Chúng tôi có thể mong đợi nhiều dòng có nhiều hơn một kết quả khớp, vì vậy chúng tôi sẽ thiết lập một vòng lặp khác để chạy qua "bốn_chữ_từ" và in ra tất cả các lần truy cập. Và sau đó chúng tôi đã hoàn thành. Lưu và thoát khỏi tập lệnh của bạn [ESC, SHIFT+ZZ trong vim] và kích hoạt nó từ dòng lệnh

python py-search.py

Và, thì đấy, bạn đã có nó. Tất cả các từ có bốn chữ cái trong KJV. Mỗi f * cking một

Tất nhiên là trừ khi tôi làm hỏng thứ gì đó. Như thường lệ, nếu bạn phát hiện ra vấn đề hoặc tôi không rõ ràng, chỉ cần gửi email cho tôi hoặc gửi nhận xét và chúng tôi sẽ giải quyết vấn đề đó. Hy vọng điều này hữu ích cho ai đó

Chủ Đề