Biểu thức chính quy là gì?
Trong thế giới thực, phân tích cú pháp chuỗi trong hầu hết các ngôn ngữ lập trình được xử lý bởi biểu thức chính quy. Biểu thức chính quy trong ngôn ngữ lập trình python là một phương thức được sử dụng để đối sánh mẫu văn bản.
Mô-đun "lại" đi kèm với mọi cài đặt python cung cấp hỗ trợ biểu thức chính quy.
Trong python, một tìm kiếm biểu thức chính quy thường được viết là:
match = re.search(pattern, string)
Phương thức re.search () nhận hai đối số, một mẫu biểu thức chính quy và một chuỗi và tìm kiếm mẫu đó trong chuỗi. Nếu mẫu được tìm thấy trong chuỗi, search () trả về đối tượng khớp hoặc Không có. Vì vậy, trong một biểu thức chính quy, một chuỗi đã cho, hãy xác định xem chuỗi đó có khớp với một mẫu nhất định hay không và, tùy chọn, thu thập các chuỗi con chứa thông tin liên quan. Một biểu thức chính quy có thể được sử dụng để trả lời các câu hỏi như -
-
Chuỗi này có phải là URL hợp lệ không?
-
Những người dùng nào trong / etc / passwd thuộc một nhóm nhất định?
-
Ngày và giờ của tất cả các thông báo cảnh báo trong tệp nhật ký là gì?
-
Tên người dùng và tài liệu nào được yêu cầu bởi URL mà khách truy cập đã nhập?
Các mẫu phù hợp
Biểu thức chính quy là một ngôn ngữ nhỏ phức tạp. Chúng dựa vào các ký tự đặc biệt để khớp các chuỗi không xác định, nhưng hãy bắt đầu với các ký tự chữ, chẳng hạn như chữ cái, số và ký tự khoảng trắng, luôn khớp với chính chúng. Hãy xem một ví dụ cơ bản:
#Need module 're' for regular expression import re # search_string = "TutorialsPoint" pattern = "Tutorials" match = re.match(pattern, search_string) #If-statement after search() tests if it succeeded if match: print("regex matches: ", match.group()) else: print('pattern not found')
Kết quả
regex matches: Tutorials
Khớp một chuỗi
Mô-đun “re” của python có nhiều phương thức và để kiểm tra xem một biểu thức chính quy cụ thể có khớp với một chuỗi cụ thể hay không, bạn có thể sử dụng re.search (). Re.MatchObject cung cấp thông tin bổ sung như phần nào của chuỗi mà đối sánh đã được tìm thấy.
Cú pháp
matchObject = re.search(pattern, input_string, flags=0)
Ví dụ
#Need module 're' for regular expression import re # Lets use a regular expression to match a date string. regex = r"([a-zA-Z]+) (\d+)" if re.search(regex, "Jan 2"): match = re.search(regex, "Jan 2") # This will print [0, 5), since it matches at the beginning and end of the # string print("Match at index %s, %s" % (match.start(), match.end())) # The groups contain the matched values. In particular: # match.group(0) always returns the fully matched string # match.group(1), match.group(2), ... will return the capture # groups in order from left to right in the input string # match.group() is equivalent to match.group(0) # So this will print "Jan 2" print("Full match: %s" % (match.group(0))) # So this will print "Jan" print("Month: %s" % (match.group(1))) # So this will print "2" print("Day: %s" % (match.group(2))) else: # If re.search() does not match, then None is returned print("Pattern not Found! ")
Kết quả
Match at index 0, 5 Full match: Jan 2 Month: Jan Day: 2
Vì phương thức trên dừng sau lần so khớp đầu tiên, do đó, phù hợp hơn để kiểm tra một biểu thức chính quy hơn là trích xuất dữ liệu.
Chụp nhóm
Nếu mẫu bao gồm hai hoặc nhiều dấu ngoặc đơn, thì kết quả cuối cùng sẽ là một bộ giá trị thay vì một danh sách chuỗi, với sự trợ giúp của cơ chế nhóm ngoặc đơn () và Finall (). Mỗi mẫu phù hợp được đại diện bởi một bộ và mỗi bộ chứa dữ liệu nhóm (1), nhóm (2) ...
import re regex = r'([\w\.-]+)@([\w\.-]+)' str = ('hello [email protected], [email protected], hello [email protected]') matches = re.findall(regex, str) print(matches) for tuple in matches: print("Username: ",tuple[0]) #username print("Host: ",tuple[1]) #host
Kết quả
[('john', 'hotmail.com'), ('hello', 'Tutorialspoint.com'), ('python', 'gmail.com')] Username: john Host: hotmail.com Username: hello Host: Tutorialspoint.com Username: python Host: gmail.com
Tìm và thay thế chuỗi
Một nhiệm vụ phổ biến khác là tìm kiếm tất cả các trường hợp của mẫu trong chuỗi đã cho và thay thế chúng, re.sub (mẫu, thay thế, chuỗi) sẽ chính xác làm điều đó. Ví dụ:thay thế tất cả các phiên bản của một miền email cũ
Mã
# requid library import re #given string str = ('hello [email protected], [email protected], hello [email protected], Hello World!') #pattern to match pattern = r'([\w\.-]+)@([\w\.-]+)' #replace the matched pattern from string with, replace = r'\[email protected]' ## re.sub(pat, replacement, str) -- returns new string with all replacements, ## \1 is group(1), \2 group(2) in the replacement print (re.sub(pattern, replace, str))
Kết quả
hello [email protected], [email protected], hello [email protected], Hello World!
Cờ tùy chọn lại
Trong biểu thức chính quy python như trên, chúng ta có thể sử dụng các tùy chọn khác nhau để sửa đổi hành vi của đối sánh mẫu. Các đối số bổ sung này, cờ tùy chọn được thêm vào hàm search () hoặc findall (), v.v., ví dụ:re.search (mẫu, chuỗi, re.IGNORECASE).
-
BỎ QUA -
Như tên đã chỉ ra, nó làm cho mẫu không phân biệt chữ hoa chữ thường (hoa / thường), với điều này, các chuỗi chứa ‘a’ và ‘A’ đều khớp.
-
BÓNG ĐÁ
Re.DOTALL cho phép siêu ký tự dấu chấm (.) Khớp với tất cả các ký tự bao gồm cả dòng mới (\ n).
-
MULTILINE
Re.MULTILINE cho phép đối sánh phần bắt đầu (^) và kết thúc ($) của mỗi dòng trong một chuỗi. Tuy nhiên, nói chung, ^ và &sẽ chỉ khớp với phần đầu và phần cuối của toàn bộ chuỗi.