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注入的題解了。