Hướng dẫn advanced regular expression in python - biểu thức chính quy nâng cao trong python

Bởi Bernd Klein. Sửa đổi lần cuối: 01 tháng 2 năm 2022.Bernd Klein. Last modified: 01 Feb 2022.

Trên trang này

Giới thiệu

Trong phần giới thiệu của chúng tôi về các biểu thức thường xuyên của hướng dẫn của chúng tôi, chúng tôi đã đề cập đến các nguyên tắc cơ bản của các biểu thức thường xuyên. Chúng tôi đã chỉ ra rằng biểu thức chính quy đơn giản nhất trông như thế nào. Chúng tôi cũng đã học được, cách sử dụng các biểu thức chính quy trong Python bằng cách sử dụng các phương thức Search () và Match () của mô -đun RE. Khái niệm xây dựng và sử dụng các lớp ký tự nên được biết đến ngay bây giờ, cũng như các lớp ký tự được xác định trước như \ d, \ d, \ s, \ s, v.v. Bạn phải học cách khớp với phần đầu và phần cuối của một chuỗi với biểu thức thông thường. Bạn phải biết ý nghĩa đặc biệt của dấu hỏi để làm cho các mục tùy chọn. Chúng tôi cũng đã giới thiệu các bộ định lượng để lặp lại các ký tự và nhóm tùy ý hoặc trong một số phạm vi nhất định.

Bạn cũng phải làm quen với việc sử dụng nhóm và cú pháp và việc sử dụng các tài liệu tham khảo ngược.

Hơn nữa, chúng tôi đã giải thích các đối tượng khớp của mô -đun RE và thông tin chúng chứa và cách truy xuất thông tin này bằng cách sử dụng các phương thức Span (), start (), end () và nhóm ().

Phần giới thiệu kết thúc với một ví dụ toàn diện trong Python.

Trong chương này, chúng tôi sẽ tiếp tục giải thích về cú pháp của các biểu thức thông thường. Chúng tôi cũng sẽ giải thích các phương pháp tiếp theo của mô -đun Python RE. Ví dụ. Làm thế nào để tìm tất cả các chuỗi con phù hợp của một biểu thức thông thường. Một nhiệm vụ cần lập trình trong các ngôn ngữ lập trình khác như Perl hoặc Java, nhưng có thể được xử lý với tiếng gọi của một phương pháp của mô -đun RE của Python. Cho đến nay, chúng ta chỉ biết cách xác định sự lựa chọn của các ký tự với một lớp nhân vật. Chúng tôi sẽ trình diễn cách xây dựng sự thay thế của các chuỗi con trong chương này của hướng dẫn của chúng tôi,

Tìm tất cả các chuỗi con phù hợp

Mô -đun Python RE cung cấp một phương pháp tuyệt vời khác, mà các ngôn ngữ khác như Perl và Java không cung cấp. Nếu bạn muốn tìm tất cả các chuỗi con trong một chuỗi, phù hợp với biểu thức thông thường, bạn phải sử dụng một vòng lặp trong Perl và các ngôn ngữ khác, như có thể thấy trong đoạn trích PERL sau:

while ($string =~ m/regex/g) {
  print "Found '$&'.  Next attempt at character " . pos($string)+1 . "\n";
}

Nó dễ dàng hơn rất nhiều trong Python. Không cần phải lặp. Chúng ta chỉ có thể sử dụng phương thức Findall của mô -đun RE:

 re.findall(pattern, string[, flags]) 

Findall trả về tất cả các trận đấu không chồng chéo của mẫu trong chuỗi, như một danh sách các chuỗi. Chuỗi được quét từ trái sang phải và các trận đấu được trả về theo thứ tự chúng được tìm thấy.

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)

OUTPUT:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']

Nếu một hoặc nhiều nhóm có mặt trong mẫu, Findall trả về một danh sách các nhóm. Đây sẽ là một danh sách các bộ dữ liệu nếu mẫu có nhiều hơn một nhóm. Chúng tôi chứng minh điều này trong ví dụ tiếp theo của chúng tôi. Chúng tôi có một chuỗi dài với các khóa đào tạo Python khác nhau và ngày của họ. Với cuộc gọi đầu tiên đến Findall, chúng tôi không sử dụng bất kỳ nhóm nào và nhận được chuỗi hoàn chỉnh. Trong cuộc gọi tiếp theo, chúng tôi sử dụng nhóm và Findall trả về danh sách 2 bộ, mỗi bộ có tên khóa học là thành phần đầu tiên và ngày là thành phần thứ hai:

import re
courses = "Python Training Course for Beginners: 15/Aug/2011 - 19/Aug/2011;Python Training Course Intermediate: 12/Dec/2011 - 16/Dec/2011;Python Text Processing Course:31/Oct/2011 - 4/Nov/2011"
items = re.findall("[^:]*:[^;]*;?", courses)
items

OUTPUT:

['Python Training Course for Beginners: 15/Aug/2011 - 19/Aug/2011;',
 'Python Training Course Intermediate: 12/Dec/2011 - 16/Dec/2011;',
 'Python Text Processing Course:31/Oct/2011 - 4/Nov/2011']

items = re.findall("([^:]*):([^;]*;?)", courses)
items

OUTPUT:

[('Python Training Course for Beginners', ' 15/Aug/2011 - 19/Aug/2011;'),
 ('Python Training Course Intermediate', ' 12/Dec/2011 - 16/Dec/2011;'),
 ('Python Text Processing Course', '31/Oct/2011 - 4/Nov/2011')]

Thay thế

Trong phần giới thiệu của chúng tôi về các biểu thức thường xuyên, chúng tôi đã giới thiệu các lớp nhân vật. Các lớp nhân vật cung cấp một sự lựa chọn từ một tập hợp các ký tự. Đôi khi chúng ta cần một sự lựa chọn giữa một số biểu thức thông thường. Đó là một "hoặc" và đó là lý do tại sao biểu tượng cho cấu trúc này là "|" Biểu tượng. Trong ví dụ sau, chúng tôi kiểm tra, nếu một trong những thành phố London, Paris, Zurich, Konstanz Bern hoặc Strasbourg xuất hiện trong một chuỗi trước từ "Vị trí":

import re
str = "Course location is London or Paris!"
mo = re.search(r"location.*(London|Paris|Zurich|Strasbourg)",str)
if mo: print(mo.group())

OUTPUT:

location is London or Paris

Nếu bạn coi ví dụ trước là quá nhân tạo, thì đây là một ví dụ khác. Giả sử, bạn muốn lọc email của mình. Bạn muốn tìm tất cả các thư từ (cuộc trò chuyện) giữa bạn và Guido Van Rossum, người tạo và nhà thiết kế của Python. Biểu thức chính quy sau đây là hữu ích cho mục đích này:

 re.findall(pattern, string[, flags]) 
0

Biểu thức này phù hợp với tất cả các dòng bắt đầu với 'đến:' hoặc 'từ:', tiếp theo là một không gian và sau đó là tên đầu tiên 'guido' hoặc họ 'van rossum'.

Đào tạo Python sống

Hướng dẫn advanced regular expression in python - biểu thức chính quy nâng cao trong python

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

Biên dịch các biểu thức thường xuyên

Nếu bạn muốn sử dụng cùng một regexp nhiều lần trong một tập lệnh, có thể là một ý tưởng tốt để sử dụng một đối tượng biểu thức chính quy, tức là regex được biên dịch.

Cú pháp chung:

 re.findall(pattern, string[, flags]) 
1

Biên dịch trả về một đối tượng Regex, có thể được sử dụng sau để tìm kiếm và thay thế. Hành vi biểu thức có thể được sửa đổi bằng cách chỉ định giá trị cờ.

Viết tắt Họ và tên Sự mô tả
Re.iRe.ignorecaseLàm cho trường hợp biểu thức thông thường không nhạy cảm
Re.lRe.LocaleHành vi của một số chuỗi đặc biệt như \ w, \ w, \ b, \ s, \ s sẽ được thực hiện phụ thuộc vào ngôn ngữ hiện tại, tức là ngôn ngữ của người dùng, quốc gia, v.v.
Re.mRe.Multiline^ và $ sẽ khớp ở đầu và ở cuối mỗi dòng và không chỉ ở đầu và cuối chuỗi
Re.s.Re.dotallDấu chấm "." sẽ khớp với mọi nhân vật cộng với dòng mớiplus the newline
Re.uRe.unicodeTạo ra \ w, \ w, \ b, \ b, \ d, \ d, \ s, \ s phụ thuộc vào các thuộc tính ký tự unicode
Re.xRe.verboseCho phép "biểu thức chính quy từ", tức là khoảng trắng bị bỏ qua. Điều này có nghĩa là không gian, tab và trả về vận chuyển không được khớp như vậy. Nếu bạn muốn khớp một không gian trong biểu thức chính quy dài dòng, bạn sẽ cần thoát khỏi nó bằng cách thoát nó bằng một dấu gạch chéo ngược phía trước hoặc đưa nó vào một lớp nhân vật. # cũng bị bỏ qua, ngoại trừ khi trong một lớp ký tự hoặc đi trước bởi một dấu gạch chéo ngược không được trục xuất. Tất cả mọi thứ theo "##" sẽ bị bỏ qua cho đến khi kết thúc dòng, vì vậy ký tự này có thể được sử dụng để bắt đầu nhận xét.
# are also ignored, except when in a character class or preceded by an non-escaped backslash. Everything following a "#" will be ignored until the end of the line, so this character can be used to start a comment.

Được biên dịch các đối tượng thông thường thường không tiết kiệm nhiều thời gian, bởi vì Python Biên dịch nội bộ và Caches Regexes bất cứ khi nào bạn sử dụng chúng với Re.Search () hoặc Re.Match (). Thời gian thêm duy nhất mà Regex không được biên dịch là thời gian cần thiết để kiểm tra bộ đệm, đây là một bộ tra cứu chính của từ điển.

Một lý do chính đáng để sử dụng chúng là để tách định nghĩa của một regex khỏi sử dụng nó.

Thí dụ

Chúng tôi đã giới thiệu một biểu thức thường xuyên để phù hợp với một siêu mã của Vương quốc Anh trong chương giới thiệu của chúng tôi:

 re.findall(pattern, string[, flags]) 
2

Chúng tôi chứng minh với biểu thức chính quy này, cách chúng tôi có thể sử dụng chức năng biên dịch của mô -đun RE trong phiên tương tác sau. Biểu thức chính quy "regex" được biên dịch với re.compile (regex) và đối tượng được biên dịch được lưu trong đối tượng compive_re. Bây giờ chúng tôi gọi phương thức search () của đối tượng compiled_re:

 re.findall(pattern, string[, flags]) 
3

OUTPUT:

 re.findall(pattern, string[, flags]) 
4

Tách một chuỗi có hoặc không có biểu thức thông thường

Có một phân chia phương thức chuỗi, có thể được sử dụng để chia một chuỗi thành một danh sách các chuỗi con.

 re.findall(pattern, string[, flags]) 
5

Như bạn có thể thấy, phương thức chia có hai tham số tùy chọn. Nếu không có gì được đưa ra (hoặc không có), một chuỗi sẽ được phân tách thành chuỗi con bằng cách sử dụng khoảng trắng làm dấu phân cách, tức là mỗi chuỗi con bao gồm hoàn toàn không gian trắng được sử dụng làm dấu phân cách.

Hướng dẫn advanced regular expression in python - biểu thức chính quy nâng cao trong python

Chúng tôi chứng minh hành vi này với một trích dẫn nổi tiếng của Abraham Lincoln:

 re.findall(pattern, string[, flags]) 
6

OUTPUT:

 re.findall(pattern, string[, flags]) 
7

Bây giờ chúng ta nhìn vào một chuỗi, có thể xuất phát từ một tệp calc openoffice. Chúng tôi đã thấy trong ví dụ trước đây rằng Split lấy khoảng trắng làm dấu phân cách mặc định. Chúng tôi muốn chia chuỗi trong ví dụ nhỏ sau bằng cách sử dụng dấu chấm phẩy làm dấu phân cách. Điều duy nhất chúng ta phải làm là sử dụng ";" như một lập luận của Split ():

 re.findall(pattern, string[, flags]) 
8

OUTPUT:

 re.findall(pattern, string[, flags]) 
9

Phương thức chia () có một tham số tùy chọn khác: MaxSplit. Nếu MAXSplit được đưa ra, tại hầu hết các phân tách MaxSplit được thực hiện. Điều này có nghĩa là danh sách kết quả sẽ có hầu hết các yếu tố "MaxSplit + 1". Chúng tôi sẽ minh họa chế độ hoạt động của MaxSplit trong ví dụ tiếp theo:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
0

OUTPUT:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
1

Chúng tôi đã sử dụng một khoảng trống như một chuỗi phân cách trong ví dụ trước, có thể là một vấn đề: nếu nhiều khoảng trống hoặc khoảng trắng được kết nối một tab bên trong ('\ t') trong danh sách kết quả của chúng tôi:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
2

OUTPUT:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
3

Chúng ta có thể ngăn chặn việc tách các chuỗi trống bằng cách sử dụng không làm đối số đầu tiên. Bây giờ Split sẽ sử dụng hành vi mặc định, tức là mọi chuỗi con bao gồm các ký tự khoảng trắng được kết nối sẽ được lấy làm một dấu phân cách:

OUTPUT:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
4

Chia biểu thức chính quy

Phương thức chuỗi chia () là công cụ phù hợp trong nhiều trường hợp, nhưng nếu bạn muốn, ví dụ: Để có được các từ trần của một văn bản, tức là không có bất kỳ ký tự và khoảng trắng đặc biệt nào. Nếu chúng ta muốn điều này, chúng ta phải sử dụng chức năng phân chia từ mô -đun RE. Chúng tôi minh họa phương pháp này bằng một văn bản ngắn từ đầu biến thái của OVID:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
5

OUTPUT:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
6

Ví dụ sau đây là một trường hợp tốt, trong đó biểu thức chính quy thực sự vượt trội so với phân chia chuỗi. Giả sử rằng chúng ta có các dòng dữ liệu với họ, tên đầu tiên và nghề nghiệp của tên. Chúng tôi muốn xóa dòng dữ liệu của các mô tả văn bản thừa và dư thừa, tức là "họ nghề nghiệp trong cột thứ ba:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
7

OUTPUT:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
8

Chúng tôi có thể dễ dàng cải thiện tập lệnh bằng cách sử dụng toán tử lát cắt, để chúng tôi không có chuỗi trống làm phần tử đầu tiên trong danh sách kết quả của chúng tôi:

t="A fat cat doesn't eat oat but a rat eats bats."
mo = re.findall("[force]at", t)
print(mo)
9

OUTPUT:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
0

Và bây giờ đối với một cái gì đó hoàn toàn khác: có một mối liên hệ giữa Barack Obama và Python, hoặc Monty Python tốt hơn. John Cleese, một trong những thành viên của Monty Python nói với The Western Daily Press vào tháng 4 năm 2008: "Tôi sẽ cung cấp dịch vụ của mình cho anh ấy với tư cách là một nhà văn lời nói vì tôi nghĩ anh ấy là một người đàn ông xuất sắc."

Tìm kiếm và thay thế bằng phụ

Re.sub (Regex, thay thế, chủ đề)

Mỗi trận đấu của biểu thức chính quy Regex trong chủ đề chuỗi sẽ được thay thế bằng cách thay thế chuỗi.Thí dụ:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
1

OUTPUT:

Bài tập

Bài tập 1

Cho là một tệp có tên 'order_journal.txt' ở định dạng sau:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
2

OUTPUT:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
3

Viết một tệp mới 'order_journal_regrouped.txt', trong đó dữ liệu được tập hợp lại theo cách sau:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
4

Các giải pháp

Giải pháp cho bài tập 1

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
5

Chúng ta có thể kiểm tra nội dung của tệp mới được tạo:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
6

OUTPUT:

['fat', 'cat', 'eat', 'oat', 'rat', 'eat']
7

Đào tạo Python sống

Hướng dẫn advanced regular expression in python - biểu thức chính quy nâng cao trong python

Các khóa học trực tuyến sắp tới

Ghi danh ở đây