python爬蟲之正則表達式

1、簡介

  正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些匹配某個模式的文本。python

  compile 函數根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。正則表達式

2、使用方法

  一、簡單看一下寫法ssh

  函數語法:編輯器

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

  

函數參數說明:
參數	描述
pattern	匹配的正則表達式
string	要匹配的字符串。
flags	標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
  匹配成功re.match方法返回一個匹配的對象,不然返回None。   咱們可使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
匹配對象方法 描述 group(num=0) 匹配的整個表達式的字符串,group() 能夠一次輸入多個組號,在這種狀況下它將返回一個包含那些組所對應值的元組。 groups() 返回一個包含全部小組字符串的元組,從 1 到 所含的小組號。

  

import re

p = re.compile('abcd')
print(type(p))
#<class '_sre.SRE_Pattern'>
print(dir(p))
#['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn']
m = p.match('abcdef')
print(type(m))
#<class '_sre.SRE_Match'>
print(dir(m))
#['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string']
print(m.group())
#abcd
print(m.group(0))
#abcd

  

  re.match()方法值匹配字符串的開頭若是不知足,就返回一個Nonespa

import re

p = re.compile('abcd')
m = p.match('abdcef')
print(m.group())
#AttributeError: 'NoneType' object has no attribute 'group'

  

  神奇的.regexp

import re

p = re.compile('.')
m = p.match('abdcef')
print(m.group())
#a

  

  特殊字符(元字符)orm

  注意:\在裏面是轉義詞的意思,例如,你想匹配一個re.compile('.'),這個.是匹配任意字符。可是我就想讓它匹配一個.怎麼辦,re.compile('\.'),這樣的話它就真的只匹配一個點。對象

   

  re.findall()

import re

p = re.compile('\.')
#匹配符號點(注意這裏可前面加上了轉義符\,就不是匹配任意字符了)
m = p.findall('abc.def.')
print(type(m))
#<class 'list'>
print(m)
#['.', '.']
#能夠得出,返回的是一個list,全局查找,不想match方法只匹配字符串開頭

  

   數量詞:blog

 

   貪婪模式和非貪婪模式

  一、一個小例子

  咱們知道*表示匹配一個字符串0次或者屢次,而+是匹配字符串1次或屢次,因此*的時候匹配了0次也打印出來了,而+只找匹配1次的字符。

import re

p = re.compile('[abc]+')
m = p.findall('abcdef')
print(m)
#*
    #['abc', '', '', '', '']
#+
    #['abc']

  

  貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行爲,貪婪模式在整個表達式匹配成功的前提下,儘量多的匹配.

  而非貪婪模式在整個表達式匹配成功的前提下,儘量少的匹配。

 

   二、{}

  根據下面的例子不難看出,數量詞{m}表示的是匹配前面字符串的幾個字符串

import re

p = re.compile('[abc]{3}')
m = p.findall('abcdabcd')
print(m)
#{1}
    #['a', 'b', 'c', 'a', 'b', 'c']
#{2}
    #['ab', 'ab']
#{3}
    #['abc', 'abc']

  

   

  re.search方法

  re.search 掃描整個字符串並返回第一個成功的匹配,不然返回的是None(注意findall返回的是list,而search返回的直接就是字符串)

import re

p = re.compile('abcd')
m = p.search('abcdabcd')
print(m.group())

  

 

  檢索和替換

 

   Python 的 re 模塊提供了re.sub用於替換字符串中的匹配項。

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

參數:

  • pattern : 正則中的模式字符串。
  • repl : 替換的字符串,也可爲一個函數。
  • string : 要被查找替換的原始字符串。
  • count : 模式匹配後替換的最大次數,默認 0 表示替換全部的匹配。

 

 示例一:
 替換一#開頭的全部字符(匹配任意字符0次或者屢次),替換成無。
import re

phone = "2004-959-559 # 這是一個國外電話號碼"
num = re.sub('#.*','',phone)
print(num)

  示例一:擴展

  找到全部非數字的字符,‘’表明着刪除。

import re

phone = "2004-959-559 # 這是一個國外電話號碼"
num = re.sub('\D','',phone)
print(num)

  

  

  正則表達式修飾符 - 可選標誌

   正則表達式能夠包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定爲一個可選的標誌。多個標誌能夠經過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標誌:

   

相關文章
相關標籤/搜索