python 正則相關函式全解析

2021-09-24 20:51:29 字數 3847 閱讀 1476

前言:

網上有很多關於python正則函式的方法說明,這裡盡可能用最簡單的demo把所有函式之間的邏輯關係說清楚,供參考。

1.最原始的 re.compile()

這個函式一般是需要和其它函式一起使用的,單獨存在沒有意義,但是要說明的是,這個函式是對正規表示式進一步的使用有很大幫助。

eg,測試字串:

test_str = "i am 18years old,you are 16years old,so good!"
測試正規表示式:

pattern = r'(\d+)([a-z]+)',  匹配數字小寫字母的連線字串(注:括號裡面的匹配可單獨獲取)
生成正則物件:

p = re.compile(pattern, re.i),re.i 是忽略大小寫的意思

def compile(pattern, flags=0):函式flags有預設值,也可以不傳這個引數

這裡列舉幾個常用的模式:

re.i(re.ignorecase): 忽略大小寫

re.m(multiline): 多行模式,改變』^』和』$』的行為

re.s(dotall): 點任意匹配模式,改變』.』的行為

re.l(locale): 使預定字元類 \w \w \b \b \s \s 取決於當前區域設定

re.u(unicode): 使預定字元類 \w \w \b \b \s \s \d \d 取決於unicode定義的字元屬性

2.match,search,findall與re.compile連用

match:

預設是從字串開始進行匹配,也可以給引數pos傳入整數作為開始匹配位置

匹配不到返回none,匹配到第乙個就返回匹配物件,用group獲取具體字串

eg,

import re

test_str = "i am 18years old,you are 16years old,so good!"

pattern = r'(\d+)([a-z]+)'

p = re.compile(pattern, re.i)

text_object = p.match(string=test_str, pos=5)

print text_object.group()

result:

18years

大多時候會把正則放在match函式裡面,這樣會減少一點**量

eg,

text_object = re.match(r'(\d+)([a-z]+)', test_str, re.i)

缺點是不能指定開始匹配的位置,預設從開始位置匹配

search:

預設從字串開始到結束順序匹配,也可以給引數pos傳入整數作為開始匹配位置

匹配不到返回none,匹配到第乙個就返回匹配物件,用group獲取具體字串

eg,

import re

test_str = "i am 18years old,you are 16years old,so good!"

pattern = r'(\d+)([a-z]+)'

p = re.compile(pattern, re.i)

text_object = p.search(string=test_str, pos=20)

print text_object.group()

print text_object.group(1)

print text_object.group(2)

result:

16years

16years

或者

re.search(r'(\d+)([a-z]+)', test_str, re.i)

因為沒辦法指定開始位置,所以只能匹配到 18years

findall:

預設把字串所有滿足條件的字元子串都找出來,返回是乙個str型別的組,

也可以pos指定開始位置,endpos指定結束位置

eg,

import re

test_str = "i am 18years old,you are 16years old,so good!"

pattern = r'(\d+)([a-z]+)'

p = re.compile(pattern, re.i)

str_arr = p.findall(test_str)

print str_arr

result:

[('18', 'years'), ('16', 'years')]

因為正規表示式是分組的,所以返回的也是分組的

或者:

re.findall(pattern=r'(/d+)([a-z]+)', string=test_str, flags=re.i)
另:還有乙個 find 函式,有時候會搞混,其實和 findall 沒一點關係,

find 函式是 str.find(),屬於字串的函式,返回的是字串的下標。

3.finditer 的特殊性

finditer 返回的是乙個匹配物件的迭代器,迭代器的好處是減少記憶體消耗,處理比較簡單的文字用不上,一次返回資料量太多的時候用處很大。

import re

test_str = "i am 18years old,you are 16years old,so good!"

pattern = r'(\d+)([a-z]+)'

p = re.compile(pattern, re.i)

iter_p = p.finditer(test_str)

for iter_next in iter_p:

print iter_next.group()

result:

18years

16years

4.字串替換 sub
import re

test_str = "i am 18years old,you are 16years old,so good!"

pattern = r'(\d+)([a-z]+)'

p = re.compile(pattern, re.i)

new_string = p.sub('17years', test_str)

print new_string

result:

i am 17years old,you are 17years old,so good!

或者:

re.sub(pattern=r'(\d+)([a-z]+)', repl='17years', string=test_str, count=1, flags=re.i)

count 引數指定替換的個數

result:

i am 17years old,you are 16years old,so good!

5.字串分隔 split
import re

test_str = "i am 18years old,you are 16years old,so good!"

arr = re.split(r'[,\d]', test_str)

print arr

result:

['i am ', '', 'years old', 'you are ', '', 'years old', 'so good!']

6.有需要再補充

PHP 危險函式全解析

在編譯 php 時,如無特殊需要,一定禁止編譯生成 cli 命令列模式的 php 解析支援。可在編譯時使用 disable cli。一旦編譯生成 cli 模式的php,則可能會被入侵者利用該程式建立乙個web shell 後門程序或通過php 執行任意 phpiwww.cppcns.comnfo 功...

python函式相關

函式的定義為 def func1 a,b,c 1,args,d kwargs pass函式定義中的引數,稱謂形參,而其中a,b稱為位置引數,c和d稱為關鍵字引數,若按順序傳參的話,c可以作位置引數來傳遞實參,而d由於位於可變引數之後,所以只能作為關鍵字引數來傳入實參,而且可變引數前的引數必須是關鍵字...

Python函式相關

對於不可變引數,函式內部操作引數不會改變實參 對於可變型別,函式內部操作會改變實參 列表,字典 全域性變數,定義時一般會在前面加 g 或 gl 列表 可以將兩個列表合併在一塊,實際就是呼叫列表的extend方法 預設引數 定義函式時,可以將某個引數定義乙個預設值,具有預設值的引數就叫預設引數 呼叫函...