1. 程式人生 > >正則表達示 for Python3

正則表達示 for Python3

ruby pre 默認 exp 需要 re.sub 和數 符號 phone

前情提要

從大量的文字內容中找到自己想要的東西,正則似乎是最好的方法.也是寫爬蟲不可缺少的技能.所以,別墨跡了趕緊好好學吧!

教程來自http://www.runoob.com/python3/python3-reg-expressions.html,感謝菜鳥教程.

一. 在Python3中 正則為 re 模塊

import re

二.re.match函數

re.match –>從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話match()就返回none,語法:

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

pattern –> 匹配正則表達式

string –>要匹配的字符串.

flags –> 標誌位,用於控制正則的匹配方式,如:是否區分大小寫,多行匹配等等.

匹配成功re.match方法返回一個匹配的對象,否則返回None.

可以用group(num)或groups()匹配對象函數來獲取匹配表達式.

group(num = 0) –> 匹配的整個表達式的字符串,group()可以一次輸入多個級號,在這種情況下它將返回一個包含那些組所對應值的元組.

groups() –> 返回一個包含所有小組字符串的元組,從1至所含的小組號.

例子:

#!/usr/bin/python3

# -*- coding:utf-8 -*-

import re

print(re.match(‘www’, ‘www.runoob.com).span()) # 在起始位置匹配. –>(0, 3)

print(re.match(‘com’, ‘www.runoob.com’) # 不在起始位置匹配. –> None

例子2:

import re

line = ‘Cats are smarter than dogs’

matchObj = re.match(r‘(.*) are (.*?) .*’, line, re.M|re.I)

if matchObj:

print(‘matchObj.group():’, matchObj.group())

print(‘matchObj.group(1):’, matchObj.group(1))

print(‘matchObj.group(2):’, matchObj.group(2))

else:

print(‘No match!!’)

三. re.search方法

re.search 掃描整個並返回第一個成功的匹配.語法:

re.search(pattern, string, flags=0) –> 參數說明和上面一樣

匹配成功會返回一個匹配的對象,否則返回None.

group(num=0)和groups() 用法和上面一樣.

例子:

import re

print(re.search(‘www’, ‘www.baidu.com’).span()) # 在起起始位置匹配. –> (0,3)

print(re.search(‘com’, ‘www.baidu.com’.span()) # 不在起始位置匹配. –>(11,14)

例子2:

import re

line = ‘Cats are smarter than dogs’

searchObj = re.search(r‘(.*) are (.*?) .*’, line, re.M|re.I)

if searchObj:

print(‘searchObj.group() : ‘, searchObj.group())

print(‘searchObj.group(1) : ‘, searchObj.group(1))

print(‘searchObj.group(2) : ‘, searchObj.group(2))

四.re.match 與 re.search的區別

re.match只匹配字符串的開始,如果字符串開始不符合正則,則匹配失敗,返回None.而re.search匹配整個字符串,直至找到一個匹配.

例子:

import re

line = ‘Cats are smarter than dogs’

matchObj = re.match(r’dogs’, line, re.M|re.I)

if matchObj:

print(‘match–>matchObj.group():’, matchObj.group())

else:

print(‘No match’)

matchObj = re.search(r’dogs’, line, re.M|re.I)

if matchObj:

print(‘search –> matchObj.group():’, matchObj.group())

else:

print(‘No match’)

五.檢索和替換

re.sub(pattren, repl, string, count=0)

參數:

pattren–> 略

repl–>替換的字符串,也可以為一個函數.

string–>要被查找替換的原始字符串.

count–>模式匹配後替換的最大次數,默認0表示替換所有的匹配.

例子:

import re

phone = ‘2004-959-559 # 這是一個電話號碼’

# 刪除註釋

num = re.sub(r’#.*$’, “”, phone)

print(‘電話號碼’, num)

#移除非數字的內容

num = re.sub(r’\D, “”, phone)

print(‘電話號碼:’,num)

六.repl的參數是一個函數

import re

#把匹配的數字*2

def double(matched):

value = int(matched.group(‘value’))

return str(value * 2)

s = ‘A23G4HFD567’

  print(re.sub(‘(?P<balue>\d+)’, double, s))

七.正則表達式修飾符 – 可選標誌

  正則表達工可以包含一些可選標誌修飾符來控制匹配的械.修飾符被指定為一個可選的標誌.多個標誌可以通過按位OR(|)它們來指定,如re.I|re.M被設置成I和M標誌:

  re.l –> 例匹配對大小寫不敏感.

  re.L –> 做本地化識別(locale-aware)匹配

  re.M –> 多行匹配,影響^和$

  re.S –> 使.匹配包括換行在內的所有字符.

  re.U –> 根據Unicode字符集解析字符,這個標誌影響 \w , \W , \b , \B

  re.X –> 通過給予你更靈活的格式以便你將正則表達式寫得更易於理解.

八.正則表達式模式

  模式字符串使用特殊的語法來表示一個正則:

  字母和數字表示他們自身.一個正則表達式模式中的字母和數字匹配同樣的字符串.

  多數字母和數字前加一個反斜杠時會擁有不同的含義.

  標點符號只有被黑底時才匹配自身,否則它們的表示特殊的含義.

  反斜杠本身需要使用反斜杠轉義

  由於正則表達式通常都包含反斜杠,所以你最好使用原始字符串來表示它們.模式元素(如r’/t’ == ‘//t’)匹配相應的特殊字符.

  下面列出了正則表達式模式語法中的特殊元素.如果你使用模式的同時提供了可選的標誌參數,某些模式元素的含義會改變.

  ^ –> 匹配字符串的開頭

  $ –> 匹配字符串的末尾

  . –> 匹配任意字符,除了換行符, 當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符.

  […] –> 用來表示一組字符,單獨列出:[amk]匹配’a’,’m’,或’k’

  [^…] –> 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符.

  re* –> 匹配0個或多個表達式.

  re+ –> 匹配1個或多個表達式.

  re? –>匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式.

  re{n} –>

  re{n,} –>精確匹配n個前面表達式.

  re{n, m} –>匹配n到m次由前面的下面表達式定義的片段,貪婪方式

  a|b –> 匹配a或b

  (re) –> G匹配括號內的表達式,也表示一個組

  (?imx) –> 正則表達式包含三種可選標誌:i,m,x, 只影響括號中的區域.

  (?-imx) –> 正則表達式關閉 i, m, 或 x 可選標誌。只影響括號中的區域。

  (?:re) –> 類似 (…), 但是不表示一個組

  (?imx: re) –> 在括號中使用i, m, 或 x 可選標誌

  (?-imx: re) –> 在括號中不使用i, m, 或 x 可選標誌

  (?#…) –> 註釋

  (?= re) –> 前向肯定界定符。如果所含正則表達式,以 … 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。

  (?! re) –> 前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功

  (?> re) –> 匹配的獨立模式,省去回溯。

  \w –> 匹配字母數字

  \W –> 匹配非字母數字

  \s –> 匹配任意空白字符,等價於[\t\n\r\f]

  \S –> 匹配任意非空字符

  \d –> 匹配任意數字,等份於[0-9]

  \D –> 匹配任意非數字

  \A –> 匹配字符串開始

  \Z –> 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串.

  \z –> 匹配字符串結束

  \G –> 匹配最後匹配完成的位置.

  \b –> 匹配一個單詞邊界,也就是指單詞和空格間的位置.例如,’re\b’可以匹配’never’中的’er’,但是不能匹配’verb’中的’er’

  \B –> 匹配非單詞邊界.和\b反過來

  \n \t等 –> 匹配一個換行符 制表符等

  \1…\9 –> 匹配第n個分組的子表達式.

  \10 –> 匹配第n個分組的子表達式,如果它經匹配,否則指的是八進制字符碼的表達式

 九.正則表達式實例

  python –> 匹配”python

  字符類

  [Pp]ython –> ‘Python’或’python’

  rub[ye] –> ‘ruby’ 或’rube’

  [aeiou] –> 匹配中括號內的任意一個字母

  [0-9] –> 匹配任何數字 類似於[0123456789]

  [a-z] –> 匹配任何小寫字母

  [A-Z] –> 匹配任何大寫字母

  [a-zA-z0-9] –> 可以匹配任何字母及數字

  [^aeiou] –> 除了aeiou字母以外的所有字符

  [^0-9] –> 除了數字外的字符

  特殊字符類

  . –> 匹配除\n這外的任何單個字符.要匹配包括\n在內的任何字符,請使用[.\n的模式]

  \d \D \s \S \w \W 上面都有了

正則表達示 for Python3