在python中正規表示式庫需要匯入re庫
import re正規表示式需要使用原生字串來表達, 原生字串(raw shtring)在普通的字串前面加 r 表示
search(pattern, string, flags=0)
search用於在字串中搜尋, 並且返回第乙個位置的match物件
pattern: 正規表示式字串
string: 待匹配的字串
flags: 控制標記
re.i 忽略大小寫
re.m ^能夠將每行當做匹配的開始
re.s 能夠匹配所有字元 (正常.只能匹配出換行以外的所有)
match(pattern, string, flahs=0)
從字串開始匹配,是匹配, 如果不匹配的話就返回none, 匹配返回match物件
三個引數與search()相同
findall(pattern, string, flahs=0)
與search()不同, findall()會查詢到所有滿足匹配的, 且返回匹配的字串形成的列表
三個引數與search()相同
split(pattern, string, maxsplit=0, flags=0)
是根據正規表示式來分割字串, 形成乙個列表返回
相同三個引數用法不變
maxsplit: 是最大分割數, 超過之後會吧剩餘的作為乙個元素輸出
finditer(pattern, string, flahs=0)
功能與findall()一致, 只是返回迭代器內含match物件
三個引數與search()相同
sub(pattern, repl, string, count, flahs=0)
將匹配成功的字串替換成repl
相同三個引數用法不變
repl: 替換成的字串
count: 最大替換次數
subn(pattern, repl, string, count, flahs=0)
這個功能引數都和sub()相同, 只是結果是乙個元組, 第乙個元素是結果, 第二個元素是替換的次數
主要, re庫的等價形式:
>>> rst = re.search(r'等同於[1‐9]\d
', '
bit 100081
')
>>> pat = re.compile(r'如果利用compile()方法的話, 上述的方法就少寫第乙個引數[1‐9]\d')
>>> rst = pat.search('
bit 100081
')
match有以下屬性
match物件的方法
在預設的情況下, python的正則匹配是貪婪匹配, 但是也有用的到最少匹配的情況, 此時需要使用?來標識
具體形式如下
通過正規表示式匹配**網頁, 來獲取商品**和商品名稱
觀察**頁面發現後面緊跟搜尋關鍵字
在url之後還有個&s表示翻頁
觀察具體頁面
因而獲得的商品名稱和**就可以通過正規表示式獲取
具體**如下
import requests例項二: 通過re庫獲得京東商品的**, 通過beautifulsoup來獲取商品資訊import re
def gethtmltext(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
return r.text
except:
return ""
def parsepage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"[\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])
except:
print("")
def printgoodslist(ilt):
tplt = "\t\t"
print(tplt.format("序號", "**", "商品名稱"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1]))
def main():
goods = '書包'
depth = 3
start_url = '' + goods
infolist =
for i in range(depth):
try:
url = start_url + '&s=' + str(44 * i)
html = gethtmltext(url)
parsepage(infolist, html)
except:
continue
printgoodslist(infolist)
main()
京東的鏈結位址為:
後面輸入的關鍵字由於編碼原因最好使用英文關鍵字如notebook等
經過分析頁面處理, 有
具體原始碼為
#!/usr/bin/env python3# -*- coding: utf-8 -*-
__author__ = 'weihuchao'
import re
import requests
from bs4 import beautifulsoup
import bs4
def geturl(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
return r.text
except:
print("獲取網頁失敗")
def getinfo(nlist, plist, content):
soup = beautifulsoup(content, "html.parser")
ptl = re.findall(r'data-price=\"[0-9.]*\"', content)
for item in ptl:
price = eval( item.split('=')[1] )
for lis in soup.find('ul', attrs=).children:
if isinstance(lis, bs4.element.tag):
name = lis.find('a').attrs['title']
def printlist(nlist, plist):
tpl = "\t\t"
print(tpl.format("序號", "商品名稱", "**"))
alllist = zip(nlist, plist)
count = 0
for item in alllist:
count += 1
print(tpl.format(count, item[0], item[1]))
def main():
nlist, plist = ,
keyword = "mac"
url = "" + keyword
content = geturl(url)
getinfo(nlist, plist, content)
printlist(nlist, plist)
if __name__ == "__main__":
main()
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...
Linux正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...