正規表示式
[ ]:一定要出現的內容
[0-9] # 一定要出現一個數字,0~9都可以
[A-Z] # 一定要出現一個大寫字母
[a-z] # 一定要出現一個小寫字母
{ }:前字元須重覆出現幾個
哈{4} # 哈哈哈
[0-9]{2} # 等於[0-9][0-9]
[0-9]{2,5} # [0-9]最少出現2次,最多出現5次
( ):優先處理
(早安|午安|晚安)你好 # 早安、午安、晚安,擇一出現。
*:出現0次到無限多次
[A-Z]*123456 # 內容為123456或AB123456皆符合
?:出現0次或1次
[A-Z]?123456 # 內容為123456或A123456皆符合
+:出現1次到無限多次
[A-Z]+123456 # 內容為A123456或ZB123456皆符合 (內容123456不符合)
正規化範例
import re
text = 'suwjvbqo1pqmxjz3pwyhv5rydc'
s= re.search('\d', text)
print(s.group(), s.start(), s.end())
Output: 1 8 9
特殊字元
\d # 數字 = [0-9]
\D # 非數字 =[ ^0-9 ]
\s # 空白字元 = [ \t\n\r\f\v]
\S # 非空白字元 = [^ \t\n\r\f\v]
\w # 字母與數字 =[0-9a-zA-Z]
\W # 非字母與數字 = [^0-9a-zA-Z]
程式範例1
# * = {0,} = 0~無限次
print(re.findall('ab*', '1add2')) # 尋找a開頭,後面b長度為0~n
print(re.findall('ab*', '1aabbbbb2')) # 尋找a開頭,後面b長度為0~n
print(re.findall('ab{0,}', '1babbb2')) # 尋找a開頭,後面b長度為0~n
print(re.findall('1[\D]*', '1abc2')) # 尋找1開頭,後面非數字長度為0~n
print(re.findall('1*c', '1abc2')) # 尋找1長度為0~n,後面出現c
Output: ['a'] ['a', 'abbbbb'] ['abbb'] ['1abc'] ['c']
程式範例2
# + = {1,} = 1~無限次
print(re.findall('ab+', '1add2')) # 尋找a開頭,後面b長度為1~n
print(re.findall('ab+', '1aab2')) # 尋找a開頭,後面b長度為1~n
print(re.findall('ab{1,}', '1babbb2')) # 尋找a開頭,後面b長度為1~n
print(re.findall('1[\D]+', '1abc2')) # 尋找1開頭,後面非數字長度為0~n
print(re.findall('\w+', '1abc2')) # 尋找字母與數字,長度為1~n
print(re.findall('[a-b1]+', '1abc2')) # 尋找字母a-b或1,長度為1~n
Output: [] ['ab'] ['abbb'] ['1abc'] ['1abc2'] ['1ab']
程式範例3
# ? = {0,1} = 0或1次
print(re.findall('ab?', '1add2')) # 尋找a開頭,後面b長度為0或1
print(re.findall('ab?', '1aab2')) # 尋找a開頭,後面b長度為0或1
print(re.findall('ab?', '1babbb2')) # 尋找a開頭,後面b長度為0或1
print(re.findall('1[\D]?', '1abc2')) # 尋找1開頭,後面非數字長度為0或1
print(re.findall('[a-b]', '1abc2')) # 尋找a或b
Output: ['a'] ['a', 'ab'] ['ab'] ['1a'] ['a', 'b']
程式範例4
# ^ = 字串的開頭 (用在中括號內的才是 "非" [^ ])
print(re.findall('^a', 'abc123')) # 以a為開頭的字
print(re.findall('^1', 'abc123')) # 以1為開頭的字
print(re.findall('^\D', 'abc123')) # 非數字開頭的字
print(re.findall('^[\D]+', 'abc123')) # 非數字開頭,長度為1~n次
print(re.findall('^\w+', 'abc123')) # 字母或數字開頭,長度為1~n次
Output: ['a'] [] ['a'] ['abc'] ['abc123']
程式範例5
# $ = 字串的結尾
print(re.findall('1$', 'abc123')) # 以1結尾的字
print(re.findall('3$', 'abc123')) # 以3結尾的字
print(re.findall('\d$', 'abc123')) # 以數字結尾的字
print(re.findall('\d+$', 'abc123')) # 以數字結尾的字,長度為1~n
print(re.findall('[\w]+$', 'abc123')) # 字母或數字結尾,長度為1~n
Output: [] ['3'] ['3'] ['123'] ['abc123']
函式:findall() 尋找全部
import re
text = 'shdfluihnlsdgjlsrfjileghluiesrgl3h42h3583593hu6i4h32896h3896h2436jl423j84936j23l4jt4lfff9m39m39f'
pwd = re.findall('\d',text)
print(pwd)
Output: ['3', '4', '2', '3', '5', '8', '3', '5', '9', '3', '6', '4', '3', '2', '8', '9', '6', '3', '8', '9', '6', '2', '4', '3', '6', '4', '2', '3', '8', '4', '9', '3', '6', '2', '3', '4', '4', '9', '3', '9', '3', '9']
函式:sub() 取代
# re.sub()
import re
pwd = re.sub('\D','',text) #不是數字的取代成空字串
print (pwd)
Output: 342358359364328963896243642384936234493939
函式:join() 串連list
tmp = re.findall('\d', text) # 挑出非數字,組成list
pwd = ''.join(tmp) # 將串列連接起來,中間不塞任何資料
print (pwd)
Output: 8784709893727894859089