1. 程式人生 > 其它 >php正則替換%3cbr%3e_Python的re模組與正則表示式小結

php正則替換%3cbr%3e_Python的re模組與正則表示式小結

技術標籤:php正則替換%3cbr%3e

一、Python模組之RE模組

一些可選值:

- re.I(全拼:ignorecase):忽略大小寫

- re.M(全拼:multiline):多行模式,改變^和$的行為

- re.S(全拼:datall):點任意匹配模式,改變.的行為

- re.L(全拼locale):是預定字串類\w \W \b \B \s \S取決於當前區域設定

- re.U(全拼:UNICODE): 使預定字元類 \w \W \b \B \s \S \d \D 取決於unicode定義的字元屬性

- re.X(全拼:VERBOSE): 詳細模式。這個模式下正則表示式可以是多行,忽略空白字元,並可以加入註釋。

方法:

1.group([group1, …]):

獲得一個或多個分組截獲的字串;指定多個引數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫引數時,返回group(0);沒有截獲字串的組返回None;截獲了多次的組返回最後一次截獲的子串。

2.groups([default]):

以元組形式返回全部分組截獲的字串。相當於呼叫group(1,2,…last)。default表示沒有截獲字串的組以這個值替代,預設為None。

3.groupdict([default]):

返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。

4.start([group]):

返回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。

5.end([group]):

返回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。

6.span([group]):

返回(start(group), end(group))。

7.expand(template):

將匹配到的分組代入template中然後返回。template中可以使用\id或\g、\g引用分組,但不能使用編號0。\id與\g是等價的;但\10將被認為是第10個分組,如果你想表達\1之後是字元’0’,只能使用\g0。

pattern可以理解為一個匹配模式,利用re.compile方法就可以。例如:

pattern = re.compile(r'hello')

在引數中傳入原生字串物件,通過compile方法生成一個pattern物件。

1.re.match(pattern,string,[flags])

這個方法會從string字串的開頭開始,嘗試匹配pattern,一直向後匹配,如遇到無法匹配的字串,返回None,如果匹配未結束已經到達string尾,也會返回None。另個結果表示匹配失敗,否則成功,同時匹配終止。

import repattern = re.compile(r'hello')#r的意思是"原生字串"result_1 = re.match(pattern,'hello')result_2 = re.match(pattern,'helloo, ASDF')result_3 = re.match(pattern,'helo asdf')result_4 = re.match(pattern,'hello adf')if result_1:    print result_1.group()else:    print "result_1 匹配失敗"if result_2:    print result_2.group()else:    print "result_2 匹配失敗"if result_3:    print result_3.group()else:    print "result_3 匹配失敗"if result_4:    print result_4.group()else:    print "result_4 匹配失敗"

結果是隻有3未匹配...

2.re.search(pattern,string,[flags])

與match類似,match是從頭開始檢測,search會掃描整個string

import repattern = re.compile(r'hello')#r的意思是"原生字串"result_1 = re.match(pattern,'hello')result_2 = re.match(pattern,'helloo, ASDF')result_3 = re.match(pattern,'helo asdf')result_4 = re.match(pattern,'hello adf')if result_1:    print result_1.group()else:    print "result_1 匹配失敗"if result_2:    print result_2.group()else:    print "result_2 匹配失敗"if result_3:    print result_3.group()else:    print "result_3 匹配失敗"if result_4:    print result_4.group()else:    print "result_4 匹配失敗"

3.re.split(pattern,string,[flags])

按照能夠匹配的子串將少天日工分割後返回列表。

maxsplit用於指定最大分割次數,不指定將全部分割

import repattern = re.compile(r'\d+')print re.split(pattern,'one1two2three3')

4.re.findall(pattern,string,[flags])

搜尋string,以列表的形式返回全部匹配的子串

import repattern = re.compile(r'\d+')print re.findall(pattern,'one1two2three3')

5.re.finditer(pattern,string,[flags])

搜尋string,返回一個順序訪問每一個匹配結果(match物件)的迭代器

import repattern = re.compile(r'\d+')for i in re.finditer(pattern,'one1two2three3four4'):    print i.group()

6.re.sub(pattern,repl,string ,[count])

使用repl替換string中每一個匹配的子串返回替換後的字串

7.re.subn(pattern,repl,string,[count])

返回 (sub(repl, string[, count]), 替換次數)

二、正則表示式

正則表示式由以下幾個部分組成:

- 原子(普通字元,如a~z)

- 有特殊功能的字元(稱為元字元,例如*+?等)

- 模式修正符

`/(.+?)/sim`

拆分後如下:

- 定界符使用的是兩個斜線'/'

- 原子用到了

- 元字元使用了[]()|.*?+d等具有特殊含義的字元

1.定界符

不僅僅侷限於斜槓/,除了字母、數字、反斜線以外的字元都可以,如#!{}|等

2.原子

原子是正則表示式最基本的組成單位,這裡將其劃分為5類進行介紹:

1. 普通字元作為原子

   如a~z,0~9,A~Z等   /5/  ---用於匹配是否有5   /php/  ---用於匹配是否有php

2. 一些特殊字元和元字元作為原子

   使用特殊字元必須轉義,如:   /\./    --用於匹配是否由於.出現   /\<br \/>/---用於匹配是否有<br />出現

3. 一些非列印字元作為原子

非列印字元,如空格,回車,製表符等。 |

原子字元含義描述
\cx匹配一個由x指明的控制字元,例如,\cM匹配一個Ctrl+M或回車符。x的值必須為a~z或者A~Z之一。否則,將c視為一個原義的d字元
\f匹配一個換頁符
\n匹配一個換行符
\r匹配一個回車符
\t匹配一個製表符
\v匹配一個垂直製表符

4. 使用“通用字元型別”作為原子

前面介紹 的不管是列印字元還是非列印字元,都是一個原子只能匹配一個字元。有時需要匹配所有字母或者所有數字,這是就要用“通用字元型別”

原子字元
\d匹配任意一個十進位制數字,等價於[0~9]
\D匹配任意一個非十進位制數字,等價於[ ^ 0~9 ]
\s匹配任意一個空白字元
\S匹配出空白字元以外的任何一個字元
\w匹配任意一個數字、字母、或下劃線
\w匹配除數字、字母、或下劃線以外的任何一個字元

5. 自定義原子表[]作為原子

直接上例子:

   /[apj]sp/   ---可以匹配asp jsp或psp三種,從原子表中僅選一種作為原子   /[^apj]sp   ---可以匹配除asp jsp 和PSP之外的字串,如xsp,zsp等   /0[xX][0-9a-fA-F]  ---可以匹配一個簡單的十六進位制數

3.元字元

元字元含義描述
*匹配0次1次或多次其前的原子
+匹配1次或多次其前的原子
?匹配0次或1次其前的原子
|匹配兩個或多個分支選擇
.匹配除了換行符之外的任意一個字元
{n}表示其前面的原子恰好出現n次
{n,}表示其前面的原子出現不少於n次
{n,m}其前面的原子出現次數介於n和m之間
^或\A匹配輸入字串的開始位置
$或\Z匹配輸入字串的結束為止
\b匹配單詞的邊界
\B匹配除單詞邊界以外的部分
[]匹配方括號中指定的任意一個原子
[^]匹配除方括號中指定的任意一個原子
()匹配器整體為一個原子,即模式單元可以理解為多個原子組成的大原子

栗子如下:

/a\s*b/        --可以匹配在a和b之間沒用空白,一個空白或多個空白的情況/a\d+b/----可以匹配在a和b之間1個數字或多個數字的情況/a\W?b/----可以匹配在a和b之間有一個或沒有特殊字元的情況/ax{4}b/----可以匹配在a和b之間必須有4個x,如axxxxb/ax{2,}b/      ----ab之間至少兩個x/ax{2,4}b/--ab之間的x的個數在2,4之間/^this/   --匹配此字串是否是以this開始的/this$//\bis\b/ ---匹配此字串中是否含有is/\Bis\b/  ----查詢字串is時,左邊不能有邊界,右邊必須有邊界,如this/a.b/  /Linux|Apache|mysql//(very)*good/ ---可以匹配good,very good,very very good ....等/(Windows)(Linus)\\2OS/  ---使用\2再次引用第二個緩衝區中的字串Linux/(?:windows)(linux)\\1OS/ ---使用?:忽略了第一個表示式的儲存,所以\1引用的就是Linux

模式匹配的優先順序:

元字元描述
\轉義符號
()、(?:)、(?=)、[]模式單元和原子表
*、+、?、{n}、{n,}、{n,m}重複匹配
^、$、\b、\B、\A、\Z邊界限制
|模式選擇

模式修正符:

模式修正符是在正則表示式定界符之外使用

模式修正符功能描述
i在和模式進行匹配時不區分大小寫
m將字串視為多行。預設的正則開始^和結束$將目標字串作為單一的一行字元(甚至其中包含有換行符也是如此)。如果在修正符中加上m,那麼開始和結束將會指字串的每一行,每一行的開頭是^,結束是$
s如果設定了次修正符,則模式中的圓點字元.匹配所有字元,包括換行符。即將字串視為單行,換行符作為普通字元看待
x模式中的空白忽略不計,除非它已經被轉義
e只用在preg_replace()函式中,在替換字串中對逆向引用做正常的替換,將其作為PHP程式碼求值,並用其結果來替換所搜尋的字串
U本修正符反轉了匹配數量的值使其不是預設的重複,而變成在後面跟上?才變得重複
D模式中的美元字元僅匹配字串的結尾。沒有此選項時,如果最後一個字元是換行符,則美元符號也會匹配此字元之前的內容。如果設定了m修正符,則忽略此選項。

下次再搞就是request模組和socket模組,還有buu、bugku等平臺的SQL注入的題解了。fd20d85eef10390be5f88124e0a8147e.png