Hướng dẫn what is search () in python? - search () trong python là gì?


Tìm kiếm là một điều cần thiết rất cơ bản khi bạn lưu trữ dữ liệu trong các cấu trúc dữ liệu khác nhau. Cách tiếp cận đơn giản nhất là đi qua mọi yếu tố trong cấu trúc dữ liệu và khớp với giá trị bạn đang tìm kiếm. Điều này được gọi là tìm kiếm tuyến tính. Nó không hiệu quả và hiếm khi được sử dụng, nhưng tạo ra một chương trình cho nó cho một ý tưởng về cách chúng ta có thể thực hiện một số thuật toán tìm kiếm nâng cao.

Tìm kiếm tuyến tính

Trong loại tìm kiếm này, một tìm kiếm tuần tự được thực hiện trên tất cả từng mục một. Mỗi mục được kiểm tra và nếu một trận đấu được tìm thấy thì mục cụ thể đó được trả về, nếu không thì tìm kiếm tiếp tục cho đến khi kết thúc cấu trúc dữ liệu.

Thí dụ

def linear_search(values, search_for):
   search_at = 0
   search_res = False
# Match the value with each data element	
   while search_at < len(values) and search_res is False:
      if values[search_at] == search_for:
         search_res = True
      else:
         search_at = search_at + 1
   return search_res
l = [64, 34, 25, 12, 22, 11, 90]
print(linear_search(l, 12))
print(linear_search(l, 91))

Đầu ra

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

True
False

Tìm kiếm nội suy

Thuật toán tìm kiếm này hoạt động trên vị trí thăm dò của giá trị cần thiết. Đối với thuật toán này hoạt động chính xác, việc thu thập dữ liệu phải ở dạng được sắp xếp và phân phối đều nhau. Về cơ bản, vị trí đầu dò là vị trí của mục giữa của bộ sưu tập. Nếu một trận đấu xảy ra, thì chỉ mục của mục được trả về . Nếu mục giữa lớn hơn mục, thì vị trí đầu dò một lần nữa được tính toán ở mép con ở bên phải của mục giữa. Mặt khác, mục được tìm kiếm trong Subarray ở bên trái của mục giữa. Quá trình này tiếp tục trên các mảng con cho đến khi kích thước của Subarray giảm xuống 0.

Thí dụ

Đầu ra

def intpolsearch(values,x ):
   idx0 = 0
   idxn = (len(values) - 1)
   while idx0 <= idxn and x >= values[idx0] and x <= values[idxn]:
# Find the mid point
	mid = idx0 +\
      int(((float(idxn - idx0)/( values[idxn] - values[idx0]))
      * ( x - values[idx0])))
# Compare the value at mid point with search value 
   if values[mid] == x:
      return "Found "+str(x)+" at index "+str(mid)
   if values[mid] < x:
      idx0 = mid + 1
   return "Searched element not in the list"

l = [2, 6, 11, 19, 27, 31, 45, 121]
print(intpolsearch(l, 2))

Đầu ra

Khi mã trên được thực thi, nó sẽ tạo ra kết quả sau -

Found 2 at index 0

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

Trong Python, một tìm kiếm biểu thức thông thường thường được viết là:

match = re.search(pat, str)

Phương thức RE.Search () có một mẫu biểu thức chính quy và một chuỗi và tìm kiếm cho 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ó đối tượng khác. Do đó, tìm kiếm thường ngay lập tức theo sau bởi một câu chuyện if để kiểm tra xem tìm kiếm có thành công hay không, như được hiển thị trong ví dụ sau đây tìm kiếm mẫu 'từ:' theo sau là từ 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')

True
False
5 lưu trữ kết quả tìm kiếm trong một biến có tên là "Match". Sau đó, if-statement kiểm tra sự phù hợp-nếu đúng, tìm kiếm đã thành công và match.group () là văn bản phù hợp (ví dụ: 'từ: cat'). Mặt khác, nếu trận đấu là sai (không có gì cụ thể hơn), thì tìm kiếm không thành công và không có văn bản phù hợp.

'R' khi bắt đầu chuỗi mẫu chỉ định chuỗi "RAW" Python đi qua các dấu gạch chéo ngược mà không thay đổi, rất tiện dụng cho các biểu thức thông thường (Java cần tính năng này một cách tồi tệ!). Tôi khuyên bạn nên luôn viết các chuỗi mẫu với 'r' giống như một thói quen.

Các mẫu cơ bản

Sức mạnh của các 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 phù hợp với ký tự đơn lẻ:

  • a, x, 9, < - các ký tự thông thường chỉ khớp chính xác. Các nhân vật tổng hợp không phù hợp với chính họ vì chúng có ý nghĩa đặc biệt là:. ^ $ * +? {[] \ | ( ) (chi tiết bên dưới)
  • . (một khoảng thời gian) - khớp với bất kỳ ký tự nào ngoại trừ Newline '\ n'
  • \ W-(chữ thường W) khớp với ký tự "từ": chữ cái hoặc chữ số hoặc thanh dưới đây [a-za-z0-9_]. Lưu ý rằng mặc dù "từ" là ghi nhớ cho điều này, nhưng nó chỉ phù hợp với một từ char, không phải là một từ toàn bộ. \ W (trường hợp trên w) khớp với bất kỳ ký tự không từ nào.
  • \ B-ranh giới giữa từ và không từ
  • \ s - (chữ thường S) khớp với một ký tự khoảng trắng duy nhất - không gian, dòng mới, return, tab, form [\ n \ r \ t \ f]. \ S (trường hợp trên s) phù hợp với bất kỳ ký tự không phải màu nào.
  • \ t, \ n, \ r - tab, newline, return
  • \ 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)
  • ^ = start, $ = end - khớp với phần bắt đầu hoặc kết thúc của chuỗi
  • \ - ức chế "sự đặc biệt" của một nhân vật. Vì vậy, ví dụ, sử dụng \. Để phù hợp với một khoảng thời gian hoặc \ để phù hợp với một dấu gạch chéo. Nếu bạn không chắc chắn nếu một nhân vật có ý nghĩa đặc biệt, chẳng hạn như '@', bạn có thể thử đặt một dấu gạch chéo trước nó, \@. 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ẽ dừng lại với một lỗi.

Ví dụ cơ bản

Trò đùa: Bạn gọi một con lợn với ba mắt là gì? Piiig!

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 một chuỗi là:

  • Tìm kiếm tiến hành qua chuỗi từ đầu đến cuối, dừng ở trận đấu đầ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
    True
    False
    
    5 thành công, khớp không phải là không có và cụ thể là match.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 sự xuất hiện của mẫu bên trái, ví dụ: 'i+' = một hoặc nhiều tôi
  • * - 0 hoặc nhiều sự xuất hiện của mẫu bên trái của nó
  • ? - khớp 0 hoặc 1 lần xuất hiện của mẫu bên trái của nó

Bên trái và lớn nhất

Đầu tiên, tìm kiếm tìm thấy sự phù hợ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ức là + và * đi càng xa càng tốt ( + 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 Purple Monkey'. Chúng tôi sẽ sử dụng điều này như một ví dụ đang chạy để thể hiện các tính năng biểu thức chính quy hơn. Đây là một nỗ lực bằng cách sử dụng mẫu r '\ w+@\ w+':

  str = 'purple  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 thông thường bên dưới.

Dấu ngoặc vuông

Các dấu ngoặc vuông có thể được sử dụng để chỉ ra một tập hợp các ký tự, vì vậy [ABC] khớp với 'A' hoặc 'B' hoặc 'C'. Các mã \ w, \ s, v.v. làm việc bên trong khung vuông với một ngoại lệ mà dấu chấm (.) Chỉ có nghĩa là một dấu chấm theo nghĩa đen. Đối với vấn đề email, dấu ngoặc vuông là một cách dễ dàng để thêm '.' và '-' với 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())  ## ''

. Để sử dụng dấu gạch ngang mà không chỉ ra một phạm vi, hãy đặt dấu gạch ngang cuối cùng, ví dụ: [ABC-]. Một chiếc mũ lên (^) khi bắt đầu một khung vuông đặt đảo ngược nó, vì vậy [^ab] có nghĩa là bất kỳ char nào ngoại trừ 'a' hoặc 'b'.

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 vấn đề email mà chúng tôi muốn trích xuất tên người dùng và máy chủ riêng biệt. Để 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ủ 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 những gì mẫu sẽ khớp, thay vào đó chúng thiết lập "nhóm" logic bên trong văn bản khớp. Trên một tìm kiếm thành công, match.group (1) là văn bản khớp tương ứng với dấu ngoặc đơn 1 bên trái và match.group (2) là văn bản tương ứng với dấu ngoặc đơn 2 bên trái. Các kết hợp đơn giản.group () vẫn là toàn bộ văn bản phù hợp như bình thường.

True
False
0

Một quy trình công việc phổ biến với các biểu thức thông thường 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.

Findall

Findall () có lẽ là hàm mạnh nhất trong mô -đun RE. Trên đây, chúng tôi đã sử dụng re.search () để tìm kết quả phù hợp đầu tiên cho một mẫu. findall () tìm * tất cả * các trận đấu 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 trận đấu.

True
False
1

Findall với các tập tin

Đố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 lại các dòng của tệp và sau đó bạn có thể gọi findall () trên mỗi dòng. Thay vào đó, hãy để findall () làm việc lặp lại cho bạn - tốt hơn nhiều! Chỉ cần cung cấp toàn bộ văn bản tệp vào findall () và để nó trả về danh sách tất cả các trận đấu trong một bước duy nhất (nhớ lại rằng f.Read () trả về toàn bộ văn bản của một tệp trong một chuỗi):

True
False
2

Findall và các nhóm

Cơ chế nhóm dấu ngoặc đơn () có thể được kết hợp với findall (). Nếu mẫu bao gồm 2 nhóm dấu ngoặc đơn trở lên, thì thay vì trả về danh sách các chuỗi, findall () trả về danh sách *bộ dữ liệu *. Mỗi tuple đại diện cho một trận đấu của mẫu và bên trong bộ tu 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ộ dữ liệu, mỗi độ dài 2 chứa tên người dùng và máy chủ, ví dụ: ('Alice', 'Google.com').

True
False
3

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 mỗi bộ. Nếu mẫu không bao gồm dấu ngoặc đơn, thì findall () trả về một 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 () sẽ trả về một danh sách các chuỗi tương ứng với nhóm duy nhất đó. (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. không được tính là kết quả nhóm.)

Quy trình làm việc và gỡ lỗi

Các mẫu biểu thức thông thường đóng gói rất nhiều ý nghĩa vào một vài ký tự, nhưng chúng rất dày đặc, bạn có thể dành 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 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 phù hợp, hãy thử làm suy yếu mẫu, loại bỏ các phần của nó để bạn có quá nhiều trận đấu. Khi nó không phù hợp, bạn không thể đạt được bất kỳ tiến bộ nào vì không có gì cụ thể để nhìn vào. Một khi nó phù hợp quá nhiều, thì bạn có thể làm việc để thắt chặt nó tăng dần để đánh vào những gì 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 như một đối số bổ sung cho tìm kiếm () hoặc findall (), v.v., ví dụ: Re.Search (Pat, str, re.ignorecase).

  • IGNORECASE - Bỏ qua sự khác biệt trên/thường xuyên để khớp, vì vậy 'A' phù hợp với cả 'A' và 'A'.
  • DOTALL - Cho phép DOT (.) Phù hợp với Newline - thông thường nó phù hợp với bất cứ điều gì ngoại trừ Newline. Điều này có thể vấp phải bạn - bạn nghĩ.* Phù hợp với mọi thứ, nhưng theo mặc định, nó không đi qua cuối một dòng. Lưu ý rằng \ s (khoảng trắng) bao gồm Newlines, vì vậy nếu bạn muốn khớp với một khoảng trắng có thể bao gồm một dòng mới, bạn chỉ có thể sử dụng \ s*
  • Multiline - Trong một chuỗi được tạo thành từ nhiều dòng, cho phép ^ và $ để khớp với phần bắt đầu và kết thúc của mỗi dòng. Thông thường ^/$ sẽ chỉ phù hợp với sự khởi đầu và kết thúc của toàn bộ chuỗi.

Tham lam so với không tham lam (tùy chọn)

Đây là phần tùy chọn cho thấy một kỹ thuật biểu hiện thông thường tiên tiến hơn không cần thiết cho các bài tập.

Giả sử bạn có văn bản với các thẻ trong đó: foo, v.v.

Giả sử bạn đang cố gắng khớp với từng thẻ với mẫu '()' - nó phù hợp với điều gì đầu tiên?

Kết quả là một chút đáng ngạc nhiên, nhưng khía cạnh tham lam của.* Khiến nó phù hợp với toàn bộ 'foo và vân vân' như một trận đấu lớn. Vấn đề là.* Đi xa đến mức có thể, thay vì dừng lại ở lần đầu tiên> (hay còn gọi là "tham lam").

Có một phần mở rộng cho biểu thức chính quy nơi bạn thêm một? Cuối cùng, chẳng hạn như.*? Hoặc.+?, Thay đổi chúng là không xanh. Bây giờ họ dừng lại ngay khi họ có thể. Vì vậy, mẫu '()' sẽ chỉ nhận được '' là trận đấu đầu tiên và '' là trận đấu thứ hai, và lần lượt nhận được mỗi cặp. Phong cách thường là bạn sử dụng a.*?, Và ngay lập tức cái nhìn đúng của nó cho một số điểm đánh dấu cụ thể (> trong trường hợp này) buộc kết thúc.*? chạy.

Các *? Phần mở rộng có nguồn gốc từ Perl và các biểu thức chính quy bao gồm các phần mở rộng của Perl được gọi là các biểu thức thông thường tương thích của Perl - PCRE. Python bao gồm hỗ trợ PCRE. Nhiều dòng lệnh sử dụng, vv có một lá cờ trong đó 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 này về "tất cả các ký tự này ngoại trừ dừng tại X" sử dụng kiểu khung vuông. Đối với những điều trên, bạn có thể viết mẫu, nhưng thay vì.* Để có được tất cả các ký tự bất kỳ char không trong ngoặc).

Thay thế (tùy chọn)

Chức năng Re.sub (Pat, thay thế, 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 khớp gốc.

Dưới đây là một ví dụ tìm kiếm tất cả các địa chỉ email và thay đổi chúng để giữ cho người dùng (\ 1) nhưng có yo-yo-dyne.com làm máy chủ.

True
False
4

Tập thể dục

Để thực hành các biểu thức thường xuyên, hãy xem bài tập tên em bé.

Làm thế nào để bạn sử dụng lệnh tìm kiếm trong Python?

Chức năng cú pháp của find () trong chuỗi python là câu/từ gốc mà bạn muốn tìm bộ con.Chất nền là câu/từ mà bạn phải tìm kiếm.Bắt đầu và kết thúc là các tham số tùy chọn.Họ chỉ định phạm vi mà các chuỗi con cần được tìm kiếm.string is the original sentence/word in which you want to look for the substring. substring is the sentence/word which you have to search. start and end are optional parameters. They specify the range where the substring needs to be searched.

Match () trong Python là gì?

khớp (mẫu, chuỗi): Phương thức này tìm thấy khớp nếu nó xảy ra khi bắt đầu chuỗi.Ví dụ: Gọi Match () trên chuỗi 'Hướng dẫn TP TP' và tìm kiếm một mẫu 'TP' sẽ khớp.Tuy nhiên, nếu chúng ta chỉ tìm kiếm các hướng dẫn, mẫu sẽ không khớp.This method finds match if it occurs at start of the string. For example, calling match() on the string 'TP Tutorials Point TP' and looking for a pattern 'TP' will match. However, if we look for only Tutorials, the pattern will not match.

Sự khác biệt giữa tìm kiếm và khớp là gì?

Python cung cấp hai hoạt động nguyên thủy khác nhau dựa trên các biểu thức thông thường: kiểm tra đối sánh chỉ cho một trận đấu ở đầu chuỗi, trong khi tìm kiếm kiểm tra đối sánh ở bất cứ đâu trong chuỗi (đây là những gì Perl làm theo mặc định).match checks for a match only at the beginning of the string, while search checks for a match anywhere in the string (this is what Perl does by default).