前言:
網上有很多關於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.字串替換 subimport 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.字串分隔 splitimport 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方法 預設引數 定義函式時,可以將某個引數定義乙個預設值,具有預設值的引數就叫預設引數 呼叫函...