python 關於正規表示式re

ckxllf發表於2020-04-21

  1.正規表示式 re

  典型的搜尋和替換操作要求您提供與預期的搜尋結果匹配的確切文字。雖然這種技術對於對靜態文字執行簡單搜尋和替換任務可能已經足夠了,但它缺乏靈活性,若採用這種方法搜尋動態文字,即使不是不可能,至少也會變得很困難。

  透過使用正規表示式,可以:

  - 測試字串內的模式。

  例如,可以測試輸入字串,以檢視字串內是否出現電話號碼模式或信用卡號碼模式。這稱為資料驗證。

  - 替換文字。

  可以使用正規表示式來識別文件中的特定文字,完全刪除該文字或者用其他文字替換它。

  - 基於模式匹配從字串中提取子字串。

  可以查詢文件內或輸入域內特定的文字。

  可以使用正規表示式來搜尋和替換標記。

  使用正規表示式的優勢:

  正規表示式是用來簡潔表達一組字串的表示式

  正規表示式是一種通用的字串表達框架

  正規表示式是一種針對字串表達“簡潔”和“特徵”思想的工具

  正規表示式可以用來判斷某字串的特徵歸屬

  正規表示式在文字處理中十分常用:

  同時查詢或替換一組字串

  匹配字串的全部或部分(主要)

  1.1 正規表示式語法

  正規表示式語法由字元和運算子構成:

  常用運算子

  . 表示任何單個字元

  [ ] 字符集,對單個字元給出取值範圍 ,如[abc]表示a、b、c,[a‐z]表示a到z單個字元

  [^ ] 非字符集,對單個字元給出排除範圍 ,如[^abc]表示非a或b或c的單個字元

  * 前一個字元0次或無限次擴充套件,如abc* 表示 ab、abc、abcc、abccc等

  + 前一個字元1次或無限次擴充套件 ,如abc+ 表示 abc、abcc、abccc等

  ? 前一個字元0次或1次擴充套件 ,如abc? 表示 ab、abc

  | 左右表示式任意一個 ,如abc|def 表示 abc、def

  {m} 擴充套件前一個字元m次 ,如ab{2}c表示abbc

  {m,n} 擴充套件前一個字元m至n次(含n) ,如ab{1,2}c表示abc、abbc

  ^ 匹配字串開頭 ,如^abc表示abc且在一個字串的開頭

  $ 匹配字串結尾 ,如abc$表示abc且在一個字串的結尾

  ( ) 分組標記,內部只能使用 | 運算子 ,如(abc)表示abc,(abc|def)表示abc、def

  \d 數字,等價於[0‐9]

  \w 單詞字元,等價於[A‐Za‐z0‐9_]

  1.3 正規表示式re庫的使用

  呼叫方式:import re

  re庫採用raw string型別表示正規表示式,表示為:r’text’,raw string是不包含對轉義符再次轉義的字串;

  1.4 re庫的主要功能函式:

  re.search() 在一個字串中搜尋匹配正規表示式的第一個位置,返回match物件

  re.search(pattern, string, flags=0)

  re.match() 從一個字串的開始位置起匹配正規表示式,返回match物件

  re.match(pattern, string, flags=0)

  re.findall() 搜尋字串,以列表型別返回全部能匹配的子串

  re.findall(pattern, string, flags=0)

  re.split() 將一個字串按照正規表示式匹配結果進行分割,返回列表型別

  re.split(pattern, string, maxsplit=0, flags=0)

  re.finditer() 搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件

  re.finditer(pattern, string, flags=0)

  re.sub() 在一個字串中替換所有匹配正規表示式的子串,返回替換後的字串

  re.sub(pattern, repl, string, count=0, flags=0)

  flags : 正規表示式使用時的控制標記:

  re.I --> re.IGNORECASE : 忽略正規表示式的大小寫,[A‐Z]能夠匹配小寫字元

  re.M --> re.MULTILINE : 正規表示式中的^運算子能夠將給定字串的每行當作匹配開始

  re.S --> re.DOTALL : 正規表示式中的.運算子能夠匹配所有字元,預設匹配除換行外的所有字元

  1.6 re庫的另一種等價用法(編譯)

  regex = re.compile(pattern, flags=0):將正規表示式的字串形式編譯成正規表示式物件

  1.7 re 庫的貪婪匹配和最小匹配

  .* Re庫預設採用貪婪匹配,即輸出匹配最長的子串

  *? 只要長度輸出可能不同的,都可以透過在運算子後增加?變成最小匹配

  2. 例項-淘寶商品比價定向爬蟲

  爬取網址:書包&js=1&stats_click=search_radio_all%25

  爬取思路:

  提交商品搜尋請求,迴圈獲取頁面

  對於每個頁面,提取商品名稱和價格資訊

  將資訊輸出到螢幕上

  # 匯入包

  import requests

  import re

  提交商品搜尋請求,迴圈獲取頁面

  def getHTMLText(url):

  """

  請求獲取html,(字串)

  :param url: 爬取網址

  :return: 字串

  """

  try:

  # 新增頭資訊,

  kv = { 鄭州婦科醫院

  'cookie': 'thw=cn; v=0; t=ab66dffdedcb481f77fd563809639584

  'user-agent': 'Mozilla/5.0'

  }

  r = requests.get(url, timeout=30, headers=kv)

  # r = requests.get(url, timeout=30)

  # print(r.status_code)

  r.raise_for_status()

  r.encoding = r.apparent_encoding

  return r.text

  except:

  return "爬取失敗"

  對於每個頁面,提取商品名稱和價格資訊

  def parsePage(ilt,html):

  try:

  plt = re.findall(r'\"view_price\"\:\"[\d\.\d]*\"',html)

  tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)

  for i in range(len(plt)):

  price = eval(plt[i].split(':')[1])

  title = eval(tlt[i].split(':')[1])

  ilt.append([price,title])

  except:

  print('')

  將資訊輸出到螢幕上

  def PrintGoodsList(ilt):

  tplt = '{:4}\t{:8}\t{:16}'

  print(tplt.format('序號','價格','商品名稱'))

  count = 0

  for g in ilt:

  count = count + 1

  print(tplt.format(count,g[0],g[1]))

  def main():

  goods = input('please input the goods:')

  depth = 3

  start_url = ''

  infoList = []

  for i in range(depth):

  try:

  url = start_url+goods+'&s='+str(44*i)

  html = getHTMLText(url)

  parsePage(infoList,html)

  except:

  continue

  PrintGoodsList(infoList)

  main()

  

在這裡插入圖片描述

  

在這裡插入圖片描述


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2687341/,如需轉載,請註明出處,否則將追究法律責任。

相關文章