Làm cách nào để bạn chỉ định một mẫu bắt được kết quả khớp ngắn nhất có thể trong python

Biểu thức chính quy là một ngôn ngữ mạnh mẽ để so khớp các mẫu văn bản. Trang này giới thiệu cơ bản về các biểu thức chính quy đủ cho các bài tập Python của chúng ta và chỉ ra cách các biểu thức chính quy hoạt động trong Python. Mô-đun "re" của Python cung cấp hỗ trợ biểu thức chính quy

Trong Python, tìm kiếm biểu thức chính quy thường được viết là

match = re.search[pat, str]

Ở đó. phương thức search[] lấy 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 tìm kiếm thành công, search[] trả về một đối tượng khớp hoặc Không có gì khác. Do đó, tìm kiếm thường được theo sau ngay lập tức bởi câu lệnh if để kiểm tra xem tìm kiếm có thành công hay không, như trong ví dụ sau tìm kiếm từ mẫu '. ' theo sau là một từ gồm 3 chữ cái [chi tiết bên dưới]

import re

str = 'an example word:cat!!'
match = re.search[r'word:\w\w\w', str]
# If-statement after search[] tests if it succeeded
if match:
  print['found', match.group[]] ## 'found word:cat'
else:
  print['did not find']

import re

str = 'an example word:cat!!'
match = re.search[r'word:\w\w\w', str]
# If-statement after search[] tests if it succeeded
if match:
  print['found', match.group[]] ## 'found word:cat'
else:
  print['did not find']
1 lưu trữ kết quả tìm kiếm trong một biến có tên là "match". Sau đó, câu lệnh if kiểm tra sự trùng khớp -- nếu đúng thì tìm kiếm thành công và khớp. group[] là văn bản phù hợp [e. g. 'từ. con mèo']. Mặt khác, nếu kết quả khớp là sai [Không cụ thể hơn], thì tìm kiếm không thành công và không có văn bản khớp

'r' ở đầu chuỗi mẫu chỉ định một chuỗi "thô" của trăn đi qua các dấu gạch chéo ngược mà không thay đổi, điều này rất thuận tiện cho các biểu thức chính quy [Java rất cần tính năng này. ]. Tôi khuyên bạn nên luôn viết các chuỗi mẫu có chữ 'r' như một thói quen

Các mẫu cơ bản

Sức mạnh của biểu thức chính quy là chúng có thể chỉ định các mẫu, không chỉ các ký tự cố định. Dưới đây là các mẫu cơ bản nhất khớp với các ký tự đơn

  • a, X, 9, < -- các ký tự thông thường khớp chính xác với nhau. Các ký tự meta không khớp với chính chúng vì chúng có ý nghĩa đặc biệt là. . ^ $ * + ? . [ ] [chi tiết bên dưới]
  • [dấu chấm] -- khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới '\n'
  • \w -- [chữ thường w] khớp với ký tự "từ". một chữ cái hoặc chữ số hoặc gạch dưới [a-zA-Z0-9_]. Lưu ý rằng mặc dù "từ" là cách ghi nhớ cho điều này, nhưng nó chỉ khớp với một từ duy nhất char, không phải toàn bộ từ. \W [chữ hoa W] khớp với bất kỳ ký tự không phải từ nào
  • \b -- ranh giới giữa từ và phi từ
  • \s -- [chữ thường s] khớp với một ký tự khoảng trắng -- dấu cách, dòng mới, trả về, tab, biểu mẫu [ \n\r\t\f]. \S [chữ hoa S] khớp với bất kỳ ký tự không phải khoảng trắng nào
  • \t, \n, \r -- tab, dòng mới, quay lại
  • \d -- chữ số thập phân [0-9] [một số tiện ích regex cũ hơn không hỗ trợ \d, nhưng tất cả chúng đều hỗ trợ \w và \s]
  • ^ = bắt đầu, $ = kết thúc -- khớp với phần đầu hoặc phần cuối của chuỗi
  • \ -- ngăn chặn "sự đặc biệt" của một ký tự. Vì vậy, ví dụ, sử dụng \. để khớp với dấu chấm hoặc \\ để khớp với dấu gạch chéo. Nếu bạn không chắc liệu một ký tự có ý nghĩa đặc biệt hay không, chẳng hạn như '@', bạn có thể thử đặt một dấu gạch chéo trước ký tự đó, \@. Nếu nó không phải là một chuỗi thoát hợp lệ, như \c, chương trình python của bạn sẽ tạm dừng do lỗi

Ví dụ cơ bản

Câu nói đùa. bạn gọi một con lợn với ba mắt là gì?

Các quy tắc cơ bản của tìm kiếm biểu thức chính quy cho một mẫu trong chuỗi là

  • Quá trình tìm kiếm tiến hành thông qua chuỗi từ đầu đến cuối, dừng ở kết quả khớp đầu tiên được tìm thấy
  • Tất cả các mẫu phải được khớp, nhưng không phải tất cả các chuỗi
  • Nếu
    import re
    
    str = 'an example word:cat!!'
    match = re.search[r'word:\w\w\w', str]
    # If-statement after search[] tests if it succeeded
    if match:
      print['found', match.group[]] ## 'found word:cat'
    else:
      print['did not find']
    
    1 thành công, đối sánh không phải là Không có và đối sánh cụ thể. group[] là văn bản phù hợp
  ## Search for pattern 'iii' in string 'piiig'.
  ## All of the pattern must match, but it may appear anywhere.
  ## On success, match.group[] is matched text.
  match = re.search[r'iii', 'piiig'] # found, match.group[] == "iii"
  match = re.search[r'igs', 'piiig'] # not found, match == None

  ## . = any char but \n
  match = re.search[r'..g', 'piiig'] # found, match.group[] == "iig"

  ## \d = digit char, \w = word char
  match = re.search[r'\d\d\d', 'p123g'] # found, match.group[] == "123"
  match = re.search[r'\w\w\w', '@@abcd!!'] # found, match.group[] == "abc"

sự lặp lại

Mọi thứ trở nên thú vị hơn khi bạn sử dụng + và * để chỉ định sự lặp lại trong mẫu

  • + -- 1 hoặc nhiều lần xuất hiện của mẫu ở bên trái, e. g. 'i+' = một hoặc nhiều tôi
  • * -- 0 hoặc nhiều lần xuất hiện của mẫu bên trái
  • ?

Ngoài cùng bên trái và lớn nhất

Đầu tiên, tìm kiếm tìm kết quả khớp ngoài cùng bên trái cho mẫu và thứ hai, nó cố gắng sử dụng càng nhiều chuỗi càng tốt -- tôi. e. + và * đi càng xa càng tốt [dấu + và * được cho là "tham lam"]

Ví dụ lặp lại

  ## i+ = one or more i's, as many as possible.
  match = re.search[r'pi+', 'piiig'] # found, match.group[] == "piii"

  ## Finds the first/leftmost solution, and within it drives the +
  ## as far as possible [aka 'leftmost and largest'].
  ## In this example, note that it does not get to the second set of i's.
  match = re.search[r'i+', 'piigiiii'] # found, match.group[] == "ii"

  ## \s* = zero or more whitespace chars
  ## Here look for 3 digits, possibly separated by whitespace.
  match = re.search[r'\d\s*\d\s*\d', 'xx1 2   3xx'] # found, match.group[] == "1 2   3"
  match = re.search[r'\d\s*\d\s*\d', 'xx12  3xx'] # found, match.group[] == "12  3"
  match = re.search[r'\d\s*\d\s*\d', 'xx123xx'] # found, match.group[] == "123"

  ## ^ = matches the start of string, so this fails:
  match = re.search[r'^b\w+', 'foobar'] # not found, match == None
  ## but without the ^ it succeeds:
  match = re.search[r'b\w+', 'foobar'] # found, match.group[] == "bar"

Ví dụ về email

Giả sử bạn muốn tìm địa chỉ email bên trong chuỗi 'xyz alice-b@google. com khỉ tím'. Chúng tôi sẽ sử dụng điều này làm ví dụ đang chạy để minh họa các tính năng biểu thức chính quy hơn. Đây là một nỗ lực sử dụng mẫu r'\w+@\w+'

  str = 'purple alice-b@google.com monkey dishwasher'
  match = re.search[r'\w+@\w+', str]
  if match:
    print[match.group[]]  ## 'b@google'

Tìm kiếm không nhận được toàn bộ địa chỉ email trong trường hợp này vì \w không khớp với '-' hoặc '. ' trong địa chỉ. Chúng tôi sẽ khắc phục điều này bằng cách sử dụng các tính năng biểu thức chính quy bên dưới

Dấu ngoặc vuông

Dấu ngoặc vuông có thể được sử dụng để biểu thị một bộ ký tự, vì vậy [abc] khớp với 'a' hoặc 'b' hoặc 'c'. Các mã \w, \s, v.v. cũng hoạt động bên trong dấu ngoặc vuông với một ngoại lệ là dấu chấm [. ] chỉ có nghĩa là một dấu chấm theo nghĩa đen. Đối với vấn đề về email, dấu ngoặc vuông là một cách dễ dàng để thêm '. ' và '-' thành tập hợp các ký tự có thể xuất hiện xung quanh @ với mẫu r'[\w. -]+@[\w. -]+' để lấy toàn bộ địa chỉ email

  match = re.search[r'[\w.-]+@[\w.-]+', str]
  if match:
    print[match.group[]]  ## 'alice-b@google.com'
[Thêm các tính năng của dấu ngoặc vuông] Bạn cũng có thể sử dụng dấu gạch ngang để biểu thị một phạm vi, vì vậy [a-z] khớp với tất cả các chữ cái viết thường. Để sử dụng dấu gạch ngang mà không chỉ ra phạm vi, hãy đặt dấu gạch ngang cuối cùng, e. g. [abc-]. Một up-hat [^] ở đầu một bộ ngoặc vuông sẽ đảo ngược nó, vì vậy [^ab] có nghĩa là bất kỳ ký tự nào ngoại trừ 'a' hoặc 'b'

Khai thác nhóm

Tính năng "nhóm" của biểu thức chính quy cho phép bạn chọn ra các phần của văn bản phù hợp. Giả sử đối với sự cố email mà chúng tôi muốn trích xuất riêng tên người dùng và Máy chủ lưu trữ. Để làm điều này, hãy thêm dấu ngoặc đơn [ ] xung quanh tên người dùng và máy chủ lưu trữ trong mẫu, như thế này. r'[[\w. -]+]@[[\w. -]+]'. Trong trường hợp này, dấu ngoặc đơn không thay đổi nội dung mẫu sẽ khớp, thay vào đó, chúng thiết lập các "nhóm" logic bên trong văn bản khớp. Khi tìm kiếm thành công, khớp. nhóm[1] là văn bản khớp tương ứng với dấu ngoặc đơn bên trái thứ nhất và khớp. nhóm[2] là văn bản tương ứng với dấu ngoặc đơn thứ 2 bên trái. trận đấu đơn giản. group[] vẫn là toàn bộ văn bản khớp như bình thường

________số 8_______

Một quy trình công việc phổ biến với các biểu thức chính quy là bạn viết một mẫu cho thứ bạn đang tìm kiếm, thêm các nhóm dấu ngoặc đơn để trích xuất các phần bạn muốn

tìm tất cả

findall[] có lẽ là hàm mạnh nhất trong re module. Ở trên chúng tôi đã sử dụng lại. search[] để tìm kết quả khớp đầu tiên cho một mẫu. findall[] tìm *tất cả* các kết quả khớp và trả về chúng dưới dạng danh sách các chuỗi, với mỗi chuỗi đại diện cho một kết quả khớp.
  ## Suppose we have a text with many email addresses
  str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'

  ## Here re.findall[] returns a list of all the found email strings
  emails = re.findall[r'[\w\.-]+@[\w\.-]+', str] ## ['alice@google.com', 'bob@abc.com']
  for email in emails:
    # do something with each found email string
    print[email]

tìm tất cả với tệp

Đối với các tệp, bạn có thể có thói quen viết một vòng lặp để lặp qua các dòng của tệp và sau đó bạn có thể gọi hàm findall[] trên mỗi dòng. Thay vào đó, hãy để findall[] thực hiện việc lặp lại cho bạn -- tốt hơn nhiều. Chỉ cần nạp toàn bộ văn bản của tệp vào findall[] và để nó trả về danh sách tất cả các kết quả phù hợp trong một bước duy nhất [hãy nhớ rằng f. read[] trả về toàn bộ văn bản của tệp trong một chuỗi]

  # Open file
  f = open['test.txt', 'r']
  # Feed the file text into findall[]; it returns a list of all the found strings
  strings = re.findall[r'some pattern', f.read[]]

tìm tất cả và Nhóm

Cơ chế nhóm ngoặc đơn [ ] có thể được kết hợp với findall[]. Nếu mẫu bao gồm 2 hoặc nhiều nhóm dấu ngoặc đơn, thì thay vì trả về danh sách chuỗi, findall[] trả về danh sách *bộ*. Mỗi bộ đại diện cho một đối sánh của mẫu và bên trong bộ là nhóm[1], nhóm[2]. dữ liệu. Vì vậy, nếu 2 nhóm dấu ngoặc đơn được thêm vào mẫu email, thì findall[] trả về một danh sách các bộ, mỗi bộ có độ dài 2 chứa tên người dùng và máy chủ, e. g. ['alice', 'google. com']

  str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'
  tuples = re.findall[r'[[\w\.-]+]@[[\w\.-]+]', str]
  print[tuples]  ## [['alice', 'google.com'], ['bob', 'abc.com']]
  for tuple in tuples:
    print[tuple[0]]  ## username
    print[tuple[1]]  ## host

Khi bạn có danh sách các bộ dữ liệu, bạn có thể lặp qua nó để thực hiện một số tính toán cho từng bộ dữ liệu. Nếu mẫu không bao gồm dấu ngoặc đơn, thì findall[] trả về danh sách các chuỗi tìm thấy như trong các ví dụ trước đó. Nếu mẫu bao gồm một bộ dấu ngoặc đơn, thì findall[] trả về danh sách các chuỗi tương ứng với nhóm đơn đó. [Tính năng tùy chọn tối nghĩa. Đôi khi bạn có các nhóm paren [ ] trong mẫu, nhưng bạn không muốn trích xuất. Trong trường hợp đó, hãy viết dấu ngoặc đơn bằng dấu ?. lúc đầu e. g. [?. ] và dấu ngoặc trái đó sẽ không được tính là kết quả nhóm. ]

Luồng công việc RE và Gỡ lỗi

Các mẫu biểu thức chính quy gói gọn rất nhiều ý nghĩa vào chỉ một vài ký tự , nhưng chúng rất dày đặc, bạn có thể mất nhiều thời gian để gỡ lỗi các mẫu của mình. Thiết lập thời gian chạy của bạn để bạn có thể chạy một mẫu và in những gì nó phù hợp một cách dễ dàng, ví dụ bằng cách chạy nó trên một văn bản thử nghiệm nhỏ và in kết quả của findall[]. Nếu mẫu không khớp với gì, hãy thử làm yếu mẫu, loại bỏ các phần của mẫu để bạn nhận được quá nhiều mẫu phù hợp. Khi nó không khớp, bạn không thể đạt được bất kỳ tiến bộ nào vì không có gì cụ thể để xem xét. Khi nó khớp quá nhiều, thì bạn có thể siết chặt nó dần dần để đạt được thứ bạn muốn

Tùy chọn

Các chức năng re có các tùy chọn để sửa đổi hành vi của khớp mẫu. Cờ tùy chọn được thêm vào dưới dạng đối số bổ sung cho tìm kiếm[] hoặc findall[], v.v. , e. g. lại. tìm kiếm [vỗ, str, lại. BỎ QUA TRƯỜNG HỢP]

  • IGNORECASE -- bỏ qua sự khác biệt về chữ hoa/chữ thường để so khớp, vì vậy 'a' khớp với cả 'a' và 'A'
  • DOTALL -- cho phép dấu chấm [. ] để khớp với dòng mới -- thông thường nó khớp với mọi thứ trừ dòng mới. Điều này có thể khiến bạn vấp ngã -- bạn nghĩ. * khớp với mọi thứ, nhưng theo mặc định, nó không vượt qua cuối dòng. Lưu ý rằng \s [khoảng trắng] bao gồm các dòng mới, vì vậy nếu bạn muốn khớp một loạt khoảng trắng có thể bao gồm một dòng mới, bạn chỉ cần sử dụng \s*
  • MULTILINE -- Trong một chuỗi gồm nhiều dòng, cho phép ^ và $ khớp với phần đầu và phần cuối của mỗi dòng. Thông thường ^/$ sẽ chỉ khớp với phần đầu và phần cuối của toàn bộ chuỗi

tham lam vs. Không tham lam [tùy chọn]

Đây là phần tùy chọn hiển thị một kỹ thuật biểu thức chính quy nâng cao hơn không cần thiết cho các bài tập

Suppose you have text with tags in it: foo and so on

Suppose you are trying to match each tag with the pattern '[]' -- what does it match first?

The result is a little surprising, but the greedy aspect of the .* causes it to match the whole 'foo and so on' as one big match. The problem is that the .* goes as far as is it can, instead of stopping at the first > [aka it is "greedy"].

There is an extension to regular expression where you add a ? at the end, such as .*? or .+?, changing them to be non-greedy. Now they stop as soon as they can. So the pattern '[]' will get just '' as the first match, and '' as the second match, and so on getting each pair in turn. The style is typically that you use a .*?, and then immediately its right look for some concrete marker [> in this case] that forces the end of the .*? run.

Các *? . Python bao gồm hỗ trợ pcre. Nhiều tiện ích dòng lệnh, v.v. có một lá cờ nơi họ chấp nhận các mẫu pcre

Một kỹ thuật cũ hơn nhưng được sử dụng rộng rãi để mã hóa ý tưởng "tất cả các ký tự này ngoại trừ dừng ở X" sử dụng kiểu dấu ngoặc vuông. Đối với những điều trên, bạn có thể viết mẫu, nhưng thay vì. * để lấy tất cả các ký tự, hãy sử dụng [^>]* để bỏ qua tất cả các ký tự không phải > [^ "đảo ngược" bộ dấu ngoặc vuông đứng đầu, để nó khớp với bất kỳ ký tự nào không nằm trong dấu ngoặc vuông]

Thay thế [tùy chọn]

Ở đó. hàm sub[pat, replacement, str] 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. Chuỗi thay thế có thể bao gồm '\1', '\2' đề cập đến văn bản từ nhóm[1], nhóm[2], v.v. từ văn bản phù hợp ban đầu

Đây là một ví dụ tìm kiếm tất cả các địa chỉ email và thay đổi chúng để giữ người dùng [\1] nhưng có yo-yo-dyne. com với tư cách là người dẫn chương trình

Đâu là sự khác biệt giữa. *? . *?

Toán tử "**" được sử dụng cho 'lũy thừa của" và "*" được sử dụng cho phép nhân . và, var= 2*3*2 để thấy sự khác biệt. Trong mã của bạn 2**2 và 2*2 mang lại cùng một giá trị.

Phương thức nào trong regex Python được sử dụng để chuyển đổi một chuỗi thành đối tượng mẫu?

compile[] được sử dụng để biên dịch một mẫu biểu thức chính quy được cung cấp dưới dạng một chuỗi thành một đối tượng mẫu biểu thức chính quy [ re. Mẫu ]. Sau này, chúng ta có thể sử dụng đối tượng mẫu này để tìm kiếm sự trùng khớp bên trong các chuỗi đích khác nhau bằng cách sử dụng các phương thức regex chẳng hạn như re. khớp [] hoặc lại. Tìm kiếm[].

Cụm từ thông dụng '[ a za z ]' khớp với cái gì?

Ví dụ: cụm từ thông dụng "[ A-Za-z] " chỉ định khớp với bất kỳ chữ cái viết hoa hoặc viết thường nào . Trong bộ ký tự, dấu gạch nối cho biết một dãy ký tự, ví dụ [A-Z] sẽ khớp với bất kỳ một chữ cái in hoa nào. Trong một bộ ký tự, ký tự ^ phủ định các ký tự sau.

Mô-đun Python nào được sử dụng trong lớp này để khớp các mẫu văn bản?

RegEx có thể được sử dụng để kiểm tra xem một chuỗi có chứa mẫu tìm kiếm đã chỉ định hay không.

Chủ Đề