正規表示式

[ ]:一定要出現的內容

[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

results matching ""

    No results matching ""