In dòng nếu chuỗi khớp với python

Cho đến nay, chúng tôi đã đọc qua các tệp, tìm kiếm các mẫu và trích xuất các đoạn khác nhau mà chúng tôi thấy thú vị. Chúng tôi đã sử dụng các phương thức chuỗi như

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
7 và
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
8 và sử dụng danh sách và cắt chuỗi để trích xuất các phần của dòng

Nhiệm vụ tìm kiếm và trích xuất này phổ biến đến mức Python có một mô-đun rất mạnh được gọi là biểu thức chính quy xử lý nhiều nhiệm vụ này khá thanh lịch. Lý do chúng tôi không giới thiệu các biểu thức chính quy sớm hơn trong cuốn sách là vì mặc dù chúng rất mạnh, nhưng chúng hơi phức tạp và cú pháp của chúng cần một số người làm quen.

Biểu thức chính quy gần như là ngôn ngữ lập trình nhỏ của riêng chúng để tìm kiếm và phân tích chuỗi. Trên thực tế, toàn bộ sách đã được viết về chủ đề biểu thức chính quy. Trong chương này, chúng ta sẽ chỉ đề cập đến những điều cơ bản của biểu thức chính quy. Để biết thêm chi tiết về biểu thức chính quy, xem

https. // vi. wikipedia. org/wiki/Regular_expression

https. // tài liệu. con trăn. tổ chức/thư viện/tái. html

Mô-đun biểu thức chính quy

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
9 phải được nhập vào chương trình của bạn trước khi bạn có thể sử dụng nó. Cách sử dụng đơn giản nhất của mô-đun biểu thức chính quy là hàm
From: [email protected]
0. Chương trình sau minh họa cách sử dụng đơn giản của chức năng tìm kiếm

# Search for lines that contain 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re01.py

Chúng tôi mở tệp, lặp qua từng dòng và sử dụng biểu thức chính quy

From: [email protected]
0 để chỉ in ra các dòng có chứa chuỗi “Từ. ”. Chương trình này không sử dụng sức mạnh thực sự của các biểu thức chính quy, vì chúng ta có thể dễ dàng sử dụng
From: [email protected]
2 để đạt được kết quả tương tự

Sức mạnh của các biểu thức chính quy đến khi chúng ta thêm các ký tự đặc biệt vào chuỗi tìm kiếm cho phép chúng ta kiểm soát chính xác hơn dòng nào khớp với chuỗi. Việc thêm các ký tự đặc biệt này vào biểu thức chính quy của chúng tôi cho phép chúng tôi thực hiện khớp và trích xuất tinh vi trong khi viết rất ít mã

Ví dụ: ký tự dấu mũ được sử dụng trong các biểu thức chính quy để khớp với "phần đầu" của một dòng. Chúng tôi có thể thay đổi chương trình của mình để chỉ khớp các dòng trong đó “Từ. ” ở đầu dòng như sau

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py

Bây giờ, chúng tôi sẽ chỉ khớp các dòng bắt đầu bằng chuỗi “Từ. ”. Đây vẫn là một ví dụ rất đơn giản mà chúng ta có thể thực hiện tương đương với phương thức

From: [email protected]
3 từ mô-đun string. Nhưng nó phục vụ để giới thiệu khái niệm rằng các biểu thức chính quy chứa các ký tự hành động đặc biệt cho phép chúng ta kiểm soát nhiều hơn về những gì sẽ khớp với biểu thức chính quy

Khớp ký tự trong biểu thức chính quy

Có một số ký tự đặc biệt khác cho phép chúng ta xây dựng các biểu thức chính quy mạnh mẽ hơn nữa. Ký tự đặc biệt được sử dụng phổ biến nhất là dấu chấm hoặc dấu chấm, khớp với bất kỳ ký tự nào

Trong ví dụ sau, biểu thức chính quy

From: [email protected]
4 sẽ khớp với bất kỳ chuỗi nào “Từ. ”, “Xxxm. ”, “F12m. ”, hoặc“ F. @m. ” vì các ký tự dấu chấm trong biểu thức chính quy khớp với bất kỳ ký tự nào

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
0

Điều này đặc biệt hiệu quả khi được kết hợp với khả năng chỉ ra rằng một ký tự có thể được lặp lại nhiều lần bằng cách sử dụng các ký tự

From: [email protected]
5 hoặc
From: [email protected]
6 trong biểu thức chính quy của bạn. Các ký tự đặc biệt này có nghĩa là thay vì khớp với một ký tự đơn lẻ trong chuỗi tìm kiếm, chúng khớp với các ký tự không hoặc nhiều hơn (trong trường hợp dấu hoa thị) hoặc một hoặc nhiều ký tự (trong trường hợp dấu cộng)

Chúng ta có thể thu hẹp hơn nữa các dòng mà chúng ta khớp bằng cách sử dụng ký tự đại diện lặp lại trong ví dụ sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py

Chuỗi tìm kiếm

From: [email protected]
7 sẽ khớp thành công các dòng bắt đầu bằng “Từ. ”, theo sau là một hoặc nhiều ký tự (
From: [email protected]
8), tiếp theo là ký hiệu. Vì vậy, điều này sẽ phù hợp với dòng sau

From: [email protected]

Bạn có thể coi ký tự đại diện

From: [email protected]
8 là mở rộng để khớp với tất cả các ký tự giữa ký tự dấu hai chấm và ký tự tại

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
8

Thật tốt khi coi các ký tự dấu cộng và dấu hoa thị là “tự đề cao”. Ví dụ: chuỗi sau sẽ khớp với ký hiệu cuối cùng trong chuỗi khi

From: [email protected]
8 đẩy ra ngoài, như minh họa bên dưới

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
0

Có thể nói dấu hoa thị hoặc dấu cộng không quá “tham lam” bằng cách thêm một ký tự khác. Xem tài liệu chi tiết để biết thông tin về cách tắt hành vi tham lam

Nếu chúng ta muốn trích xuất dữ liệu từ một chuỗi trong Python, chúng ta có thể sử dụng phương thức

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81 để trích xuất tất cả các chuỗi con khớp với biểu thức chính quy. Hãy sử dụng ví dụ về việc muốn trích xuất bất kỳ thứ gì trông giống như địa chỉ email từ bất kỳ dòng nào bất kể định dạng. Ví dụ: chúng tôi muốn lấy địa chỉ email từ mỗi dòng sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
2

Chúng tôi không muốn viết mã cho từng loại dòng, chia tách và cắt khác nhau cho từng dòng. Chương trình sau đây sử dụng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81 để tìm các dòng có địa chỉ email trong đó và trích xuất một hoặc nhiều địa chỉ từ mỗi dòng đó

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
4

Phương thức

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81 tìm kiếm chuỗi trong đối số thứ hai và trả về danh sách tất cả các chuỗi trông giống như địa chỉ email. Chúng tôi đang sử dụng chuỗi hai ký tự khớp với một ký tự không phải khoảng trắng (
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
84)

Đầu ra của chương trình sẽ là

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
7

Dịch biểu thức chính quy, chúng tôi đang tìm kiếm các chuỗi con có ít nhất một ký tự không phải khoảng trắng, theo sau là ký tự tại, theo sau là ít nhất một ký tự khác không phải khoảng trắng.

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
85 khớp với càng nhiều ký tự không phải khoảng trắng càng tốt

Cụm từ thông dụng sẽ khớp hai lần ([email được bảo vệ] và [email được bảo vệ]), nhưng nó sẽ không khớp với chuỗi “@2PM” vì không có ký tự không trống nào trước ký hiệu. Chúng ta có thể sử dụng biểu thức chính quy này trong một chương trình để đọc tất cả các dòng trong một tệp và in ra bất kỳ thứ gì trông giống như địa chỉ email như sau

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
0

Chúng tôi đọc từng dòng và sau đó trích xuất tất cả các chuỗi con khớp với biểu thức chính quy của chúng tôi. Vì

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81 trả về một danh sách, chúng tôi chỉ cần kiểm tra xem số lượng phần tử trong danh sách được trả về của chúng tôi có nhiều hơn 0 hay không để chỉ in các dòng mà chúng tôi tìm thấy ít nhất một chuỗi con trông giống như địa chỉ email

Nếu chúng ta chạy chương trình trên mbox-short. txt, chúng tôi nhận được đầu ra sau

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
1

Một số địa chỉ email của chúng tôi có các ký tự không chính xác như “<” hoặc “;” . Hãy tuyên bố rằng chúng ta chỉ quan tâm đến phần của chuỗi bắt đầu và kết thúc bằng một chữ cái hoặc một số

Để làm điều này, chúng tôi sử dụng một tính năng khác của biểu thức chính quy. Dấu ngoặc vuông được sử dụng để biểu thị một tập hợp nhiều ký tự được chấp nhận mà chúng tôi sẵn sàng xem xét khớp. Theo một nghĩa nào đó,

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
84 đang yêu cầu khớp với tập hợp “các ký tự không phải khoảng trắng”. Bây giờ chúng tôi sẽ rõ ràng hơn một chút về các ký tự mà chúng tôi sẽ khớp

Đây là biểu thức chính quy mới của chúng ta

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
2

Điều này đang trở nên hơi phức tạp và bạn có thể bắt đầu thấy tại sao các biểu thức chính quy lại là ngôn ngữ nhỏ của riêng chúng đối với chính chúng. Dịch biểu thức chính quy này, chúng tôi đang tìm kiếm các chuỗi con bắt đầu bằng một chữ cái viết thường, chữ in hoa hoặc số “[a-zA-Z0-9]”, theo sau là 0 hoặc nhiều ký tự không trống (

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
88), tiếp theo là . Lưu ý rằng chúng tôi đã chuyển từ
From: [email protected]
6 sang
From: [email protected]
5 để biểu thị không hoặc nhiều ký tự không trống vì
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
02 đã là một ký tự không trống. Hãy nhớ rằng
From: [email protected]
5 hoặc
From: [email protected]
6 áp dụng cho ký tự đơn ngay bên trái dấu cộng hoặc dấu hoa thị

Nếu chúng tôi sử dụng biểu thức này trong chương trình của mình, dữ liệu của chúng tôi sẽ sạch hơn nhiều

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
3____74

Lưu ý rằng trên các dòng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
05, biểu thức chính quy của chúng ta đã loại bỏ hai chữ cái ở cuối chuỗi (“>;”). Điều này là do khi chúng ta thêm
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
06 vào cuối biểu thức chính quy của mình, chúng ta yêu cầu rằng bất kỳ chuỗi nào mà trình phân tích cú pháp biểu thức chính quy tìm thấy phải kết thúc bằng một chữ cái. Vì vậy, khi nó nhìn thấy dấu “>” ở cuối “sakaiproject. tổ chức>;” . e. , chữ “g” là từ ghép tốt cuối cùng)

Cũng lưu ý rằng đầu ra của chương trình là một danh sách Python có một chuỗi là phần tử duy nhất trong danh sách

Kết hợp tìm kiếm và trích xuất

Nếu chúng ta muốn tìm các số trên các dòng bắt đầu bằng chuỗi “X-”, chẳng hạn như

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
5

chúng tôi không chỉ muốn bất kỳ số dấu phẩy động nào từ bất kỳ dòng nào. Chúng tôi chỉ muốn trích xuất số từ các dòng có cú pháp trên

Chúng ta có thể xây dựng biểu thức chính quy sau để chọn các dòng

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
6

Dịch cái này, chúng tôi đang nói, chúng tôi muốn các dòng bắt đầu bằng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
07, tiếp theo là 0 hoặc nhiều ký tự (
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
08), tiếp theo là dấu hai chấm (
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
09) và sau đó là khoảng trắng. Sau khoảng trắng, chúng tôi đang tìm kiếm một hoặc nhiều ký tự là chữ số (0-9) hoặc dấu chấm
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
20. Lưu ý rằng bên trong dấu ngoặc vuông, khoảng thời gian khớp với khoảng thời gian thực tế (i. e. , nó không phải là ký tự đại diện giữa các dấu ngoặc vuông)

Đây là một biểu thức rất chặt chẽ sẽ chỉ khớp với các dòng chúng tôi quan tâm như sau

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
7

Khi chúng tôi chạy chương trình, chúng tôi thấy dữ liệu được lọc độc đáo để chỉ hiển thị các dòng chúng tôi đang tìm kiếm

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
8

Nhưng bây giờ chúng ta phải giải quyết vấn đề trích xuất các số. Mặc dù việc sử dụng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
7 sẽ đủ đơn giản, nhưng chúng ta có thể sử dụng một tính năng khác của biểu thức chính quy để vừa tìm kiếm vừa phân tích cú pháp dòng cùng một lúc

Dấu ngoặc đơn là một ký tự đặc biệt khác trong biểu thức chính quy. Khi bạn thêm dấu ngoặc đơn vào biểu thức chính quy, chúng sẽ bị bỏ qua khi khớp chuỗi. Nhưng khi bạn đang sử dụng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81, dấu ngoặc đơn cho biết rằng trong khi bạn muốn toàn bộ biểu thức khớp với nhau, thì bạn chỉ quan tâm đến việc trích xuất một phần của chuỗi con khớp với biểu thức chính quy

Vì vậy, chúng tôi thực hiện thay đổi sau cho chương trình của chúng tôi

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
9

Thay vì gọi

From: [email protected]
0, chúng tôi thêm dấu ngoặc đơn xung quanh một phần của biểu thức chính quy đại diện cho số dấu phẩy động để cho biết chúng tôi chỉ muốn
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81 trả lại cho chúng tôi phần số dấu phẩy động của chuỗi phù hợp

Đầu ra từ chương trình này như sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
00

Các số vẫn nằm trong danh sách và cần được chuyển đổi từ chuỗi sang dấu phẩy động, nhưng chúng tôi đã sử dụng sức mạnh của biểu thức chính quy để tìm kiếm và trích xuất thông tin mà chúng tôi thấy thú vị

Một ví dụ khác của kỹ thuật này, nếu bạn nhìn vào tệp, có một số dòng có dạng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
01

Nếu chúng ta muốn trích xuất tất cả các số sửa đổi (số nguyên ở cuối các dòng này) bằng kỹ thuật tương tự như trên, chúng ta có thể viết chương trình sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
02

Dịch biểu thức chính quy của chúng tôi, chúng tôi đang tìm kiếm các dòng bắt đầu bằng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
25, theo sau là bất kỳ số lượng ký tự nào (
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
08), tiếp theo là
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
27, sau đó là một hoặc nhiều chữ số. Chúng tôi muốn tìm các dòng khớp với toàn bộ biểu thức nhưng chúng tôi chỉ muốn trích xuất số nguyên ở cuối dòng, vì vậy chúng tôi bao quanh
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
28 bằng dấu ngoặc đơn

Khi chúng tôi chạy chương trình, chúng tôi nhận được đầu ra sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
03

Hãy nhớ rằng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
28 là "tham lam" và nó cố tạo chuỗi chữ số càng lớn càng tốt trước khi trích xuất các chữ số đó. Hành vi “tham lam” này là lý do tại sao chúng tôi nhận được tất cả năm chữ số cho mỗi số. Mô-đun biểu thức chính quy mở rộng theo cả hai hướng cho đến khi nó gặp một ký tự không phải chữ số hoặc đầu hoặc cuối dòng

Bây giờ chúng ta có thể sử dụng các biểu thức chính quy để làm lại một bài tập trước đó trong cuốn sách mà chúng ta quan tâm đến thời gian trong ngày của mỗi thư. Chúng tôi đã tìm kiếm các dòng của mẫu

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
04

và muốn trích xuất giờ trong ngày cho mỗi dòng. Trước đây chúng tôi đã làm điều này với hai cuộc gọi đến

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
7. Đầu tiên, dòng được chia thành các từ và sau đó chúng tôi lấy ra từ thứ năm và tách nó một lần nữa trên ký tự dấu hai chấm để lấy ra hai ký tự mà chúng tôi quan tâm

Trong khi điều này hoạt động, nó thực sự dẫn đến mã khá dễ vỡ, giả sử các dòng được định dạng độc đáo. Nếu bạn đã thêm đủ kiểm tra lỗi (hoặc khối try/ngoại trừ lớn) để đảm bảo rằng chương trình của bạn không bao giờ bị lỗi khi hiển thị các dòng được định dạng không chính xác, thì mã sẽ phồng lên thành 10-15 dòng mã khá khó đọc

Chúng ta có thể làm điều này theo cách đơn giản hơn nhiều với biểu thức chính quy sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
05

Bản dịch của biểu thức chính quy này là chúng tôi đang tìm kiếm các dòng bắt đầu bằng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
41 (lưu ý khoảng trắng), theo sau là một số ký tự bất kỳ (
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
08), theo sau là khoảng trắng, theo sau là hai chữ số
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
43, theo sau là ký tự dấu hai chấm. Đây là định nghĩa của các loại dòng chúng tôi đang tìm kiếm

Để chỉ rút ra giờ bằng cách sử dụng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81, chúng tôi thêm dấu ngoặc đơn xung quanh hai chữ số như sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
06

Điều này dẫn đến chương trình sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
07

Khi chạy chương trình sẽ cho kết quả như sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
08

nhân vật trốn thoát

Vì chúng tôi sử dụng các ký tự đặc biệt trong biểu thức chính quy để khớp với đầu hoặc cuối dòng hoặc chỉ định các ký tự đại diện, nên chúng tôi cần một cách để chỉ ra rằng các ký tự này là “bình thường” và chúng tôi muốn khớp với ký tự thực, chẳng hạn như ký hiệu đô la hoặc dấu mũ

Chúng tôi có thể chỉ ra rằng chúng tôi chỉ muốn khớp một ký tự bằng cách thêm tiền tố vào ký tự đó bằng dấu gạch chéo ngược. Ví dụ: chúng ta có thể tìm số tiền với biểu thức chính quy sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
09

Vì chúng tôi đặt trước ký hiệu đô la một dấu gạch chéo ngược, nên nó thực sự khớp với ký hiệu đô la trong chuỗi đầu vào thay vì khớp với "cuối dòng" và phần còn lại của biểu thức chính quy khớp với một hoặc nhiều chữ số hoặc ký tự dấu chấm. Ghi chú. Trong ngoặc vuông, các ký tự không phải là “đặc biệt”. Vì vậy, khi chúng tôi nói

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
45, nó thực sự có nghĩa là chữ số hoặc dấu chấm. Bên ngoài dấu ngoặc vuông, dấu chấm là ký tự "thẻ đại diện" và khớp với bất kỳ ký tự nào. Trong dấu ngoặc vuông, dấu chấm là dấu chấm

Bản tóm tắt

Mặc dù điều này mới chỉ làm trầy xước bề mặt của các biểu thức chính quy, nhưng chúng ta đã học được một chút về ngôn ngữ của các biểu thức chính quy. Chúng là các chuỗi tìm kiếm có các ký tự đặc biệt trong đó truyền đạt mong muốn của bạn đến hệ thống biểu thức chính quy về những gì định nghĩa "khớp" và những gì được trích xuất từ ​​​​các chuỗi phù hợp. Dưới đây là một số ký tự đặc biệt và chuỗi ký tự

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
46 Khớp với đầu dòng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
47 Khớp với cuối dòng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
48 Khớp với bất kỳ ký tự nào (ký tự đại diện)

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
49 So khớp với ký tự khoảng trắng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
84 So khớp với ký tự không phải khoảng trắng (đối diện với \s)

From: [email protected]
5 Áp dụng cho (các) ký tự ngay trước đó và cho biết khớp với 0 hoặc nhiều lần

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
72 Áp dụng cho (các) ký tự liền trước và cho biết khớp 0 hoặc nhiều lần trong “chế độ không tham lam”

From: [email protected]
6 Áp dụng cho (các) ký tự liền trước và cho biết khớp một hoặc nhiều lần

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
74 Áp dụng cho (các) ký tự ngay trước đó và cho biết khớp một hoặc nhiều lần trong “chế độ không tham lam”

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
75 Áp dụng cho (các) ký tự ngay trước đó và cho biết khớp với 0 hoặc một lần

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
76 Áp dụng cho (các) ký tự ngay trước đó và cho biết khớp với 0 hoặc một lần trong “chế độ không tham lam”

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
77 So khớp với một ký tự miễn là ký tự đó nằm trong tập hợp đã chỉ định. Trong ví dụ này, nó sẽ khớp với “a”, “e”, “i”, “o” hoặc “u”, nhưng không khớp với các ký tự khác

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
78 Bạn có thể chỉ định phạm vi ký tự bằng cách sử dụng dấu trừ. Ví dụ này là một ký tự đơn phải là chữ thường hoặc chữ số

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
79 Khi ký tự đầu tiên trong ký hiệu tập hợp là dấu mũ, nó sẽ đảo ngược logic. Ví dụ này khớp với một ký tự không phải là chữ hoa hoặc chữ thường

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
00 Khi các dấu ngoặc đơn được thêm vào một biểu thức chính quy, chúng sẽ bị bỏ qua vì mục đích khớp, nhưng cho phép bạn trích xuất một tập hợp con cụ thể của chuỗi đã khớp thay vì toàn bộ chuỗi khi sử dụng
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
02 So khớp với chuỗi rỗng, nhưng chỉ ở đầu hoặc cuối của một từ

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
03 Khớp với chuỗi trống, nhưng không khớp với đầu hoặc cuối của một từ

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
04 Khớp với bất kỳ chữ số thập phân nào;

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
05 Khớp với bất kỳ ký tự không phải chữ số nào;

Phần thưởng cho người dùng Unix/Linux

Hỗ trợ tìm kiếm tệp bằng biểu thức chính quy đã được tích hợp vào hệ điều hành Unix từ những năm 1960 và nó có sẵn trong hầu hết các ngôn ngữ lập trình ở dạng này hay dạng khác

Trên thực tế, có một chương trình dòng lệnh được tích hợp trong Unix có tên là grep (Trình phân tích cú pháp biểu thức chính quy tổng quát) hoạt động khá giống với 30 ví dụ trong chương này. Vì vậy, nếu bạn có hệ thống Macintosh hoặc Linux, bạn có thể thử các lệnh sau trong cửa sổ dòng lệnh của mình

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
0

Điều này yêu cầu

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
07 hiển thị cho bạn các dòng bắt đầu bằng chuỗi “Từ. ” trong tệp mbox-short. txt. Nếu bạn thử nghiệm một chút với lệnh
# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
07 và đọc tài liệu về
# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
07, bạn sẽ thấy một số khác biệt tinh tế giữa hỗ trợ biểu thức chính quy trong Python và hỗ trợ biểu thức chính quy trong
# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
07. Ví dụ:
# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
07 không hỗ trợ ký tự không trống
# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
84, vì vậy bạn sẽ cần sử dụng ký hiệu tập hợp phức tạp hơn một chút
# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
13, điều này đơn giản có nghĩa là khớp một ký tự không phải là khoảng trắng

gỡ lỗi

Python có một số tài liệu tích hợp đơn giản và thô sơ có thể khá hữu ích nếu bạn cần ôn lại nhanh để kích hoạt trí nhớ của mình về tên chính xác của một phương thức cụ thể. Tài liệu này có thể được xem trong trình thông dịch Python ở chế độ tương tác

Bạn có thể hiển thị hệ thống trợ giúp tương tác bằng cách sử dụng

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
14

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
1

Nếu bạn biết mình muốn sử dụng module nào, bạn có thể sử dụng lệnh

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
15 để tìm các phương thức trong module như sau

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
2

Bạn cũng có thể lấy một lượng nhỏ tài liệu về một phương thức cụ thể bằng cách sử dụng lệnh dir

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
3

Tài liệu tích hợp không quá phong phú, nhưng nó có thể hữu ích khi bạn đang vội hoặc không có quyền truy cập vào trình duyệt web hoặc công cụ tìm kiếm

Bảng chú giải

mã giòn Mã hoạt động khi dữ liệu đầu vào ở một định dạng cụ thể nhưng dễ bị hỏng nếu có một số sai lệch so với định dạng chính xác. Chúng tôi gọi đây là “mã giòn” vì nó dễ bị phá vỡ. khớp tham lamKhái niệm rằng các ký tự
From: [email protected]
6 và
From: [email protected]
5 trong một biểu thức chính quy mở rộng ra bên ngoài để khớp với chuỗi lớn nhất có thể. grepMột lệnh có sẵn trong hầu hết các hệ thống Unix tìm kiếm thông qua các tệp văn bản để tìm các dòng khớp với các biểu thức thông thường. Tên lệnh là viết tắt của “Generalized Regular Expression Parser”. ngôn ngữ biểu thức chính quy để thể hiện các chuỗi tìm kiếm phức tạp hơn. Một biểu thức chính quy có thể chứa các ký tự đặc biệt cho biết rằng tìm kiếm chỉ khớp ở đầu hoặc cuối dòng hoặc nhiều khả năng tương tự khác. ký tự đại diện Một ký tự đặc biệt phù hợp với bất kỳ ký tự nào. Trong các biểu thức chính quy, ký tự đại diện là dấu chấm

bài tập

bài tập 1. Viết chương trình đơn giản mô phỏng hoạt động của lệnh

# Search for lines that start with 'From'
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:', line):
        print(line)

# Code: http://www.py4e.com/code3/re02.py
07 trên Unix. Yêu cầu người dùng nhập biểu thức chính quy và đếm số dòng khớp với biểu thức chính quy

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
4

Bài tập 2. Viết chương trình tìm các dòng có dạng

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
5

Trích xuất số từ mỗi dòng bằng biểu thức chính quy và phương thức

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt')
for line in hand:
    line = line.rstrip()
    if re.search('^From:[email protected]', line):
        print(line)

# Code: http://www.py4e.com/code3/re04.py
81. Tính trung bình cộng của các số và in ra trung bình dưới dạng số nguyên