Computer >> Máy Tính >  >> Lập trình >> Python

Đối sánh mẫu trong Python với Regex

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 john@hotmail.com, hello@Tutorialspoint.com, hello python@gmail.com')
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ũ

# requid library
import re
#given string
str = ('hello john@hotmail.com, hello@Tutorialspoint.com, hello python@gmail.com, Hello World!')
#pattern to match
pattern = r'([\w\.-]+)@([\w\.-]+)'
#replace the matched pattern from string with,
replace = r'\1@XYZ.com'
   ## 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 john@XYZ.com, hello@XYZ.com, hello python@XYZ.com, 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.