- 正則表達式是一種工具,它定義了字符串的匹配模式.
- 檢查一個字符串是否跟某種模式匹配的部分或者從一個字符串中將與模式匹配的部分提取出來或者替換。
- 1 正則表達式預熱
def is_valid_username(username):
"""
判斷用戶名是否有效,有效,返回True,無效返回False,
用戶名必須由字母、數字、下劃線組成,且長度爲6-20個字符
"""
if 6 <= len(username) <= 20:
for ch in username:
if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' or ch == '_'):
return False
return True
return False
def main():
print(is_valid_username('admin'))
print(is_valid_username('_andmin_'))
print(is_valid_username('momowang'))
print(is_valid_username('jhdsjgshdgfewhegjfsfsdf'))
print(is_valid_username('5454dfd*fdsncxj'))
if __name__ == '__main__':
main()
- 2 正則表達式 — 是一種工具 - 定義字符串的匹配模式
場景-1
"""
判斷用戶名是否有效,有效,返回True,無效返回False,
用戶名必須由字母、數字、下劃線組成,且長度爲6-20個字符
"""
# re - Regular Expression
import re
def main():
username = 'momowang'
# search 從任意位置開始匹配, 匹配完成的字符串,用^$,開始和結尾
# match - 從第一個字符開始匹配
m = re.match(r'\w{6,20}',username)
# 前面需要加r---原始字符串username -- 返回匹配對象
if m:
print(m)
# m.span() 那個部分匹配成功, 得到匹配的範圍
print(m.span())
print(m.group()) # 取出匹配合適的部分
if __name__ == '__main__':
main()
場景-2
import re
def main():
username = 'momowang!@#$%'
# 可以匹配成功,因爲從開始匹配,成功後就不再考慮後面的內容了
m = re.match(r'\w{6,20}', username)
if m:
print(m)
# m.span() 那個部分匹配成功, 得到匹配的範圍
print(m.span())
print(m.group()) # 取出匹配合適的部分
if __name__ == '__main__':
main()
場景-3
import re
def main():
username = '!@#$%momowang!@#$%'
# 不能匹配成功,因爲不是以字母、數字和下劃線開始的
m = re. match(r'\w{6,20}', username)
if m:
print(m)
# m.span() 那個部分匹配成功, 得到匹配的範圍
print(m.span())
print(m.group()) # 取出匹配合適的部分
if __name__ == '__main__':
main()
場景-4
import re
def main():
username = 'momowang'
# m = re.match(r'^\w{6,20}$', username) # match匹配成功返回內容,匹配不成功,返回None,^字符串的開始,$字符串結束
m = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
if m:
print(m)
# m.span() 那個部分匹配成功, 得到匹配的範圍
print(m.span())
print(m.group()) # 取出匹配合適的部分
if __name__ == '__main__':
main()
場景-5
import re
def main():
username = 'momowang'
# 如果一個正則表達式創建了之後,需要反覆的利用,應該換如下的寫法,效果與上面相同,且性能會更好
pattern1 = re.compile(r'^[0-9a-zA-Z_]{6,20}$')
m = pattern1.match(username)
if m:
print(m)
# m.span() 那個部分匹配成功, 得到匹配的範圍
print(m.span())
print(m.group()) # 取出匹配合適的部分
if __name__ == '__main__':
main()
- 3 判斷QQ號是否爲5-11位數字
判斷QQ號 ,0不能開頭,開頭的爲1-9,後面是任意的數字,最多爲12個數字。
最少爲5位,[1-9] - 1-9的數字,只能取任意一個 {4,11} 中間不能加空格
[1-9]\d{4,11}
import re
def main():
qq = input('請輸入qq號:')
m = re.match(r'^[1-9]\d{4,11}$', qq)
if not m: #邏輯取反
print('請輸入有效的QQ號.')
else:
print('輸入的QQ號正確,請繼續')
if __name__ == '__main__':
main()
- 4 生成隨機驗證碼
"""設計一個函數,產生隨機的驗證碼,由大小寫字母、數字組成,
調一次給一個隨機驗證碼"""
import random
def generate_code(code_len=4):
"""
生成指定長度的驗證碼
:param code_len: 驗證碼的長度
:return: 由大小寫、英文字母和數字構成的隨機驗證碼
"""
all_chars = '1234567890poiuytrewqasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM'
# chars_len = len(all_chars) 與下面#匹配用
last_pos = len(all_chars) - 1
code = ''
for _ in range(code_len):
index = random.randint(1, last_pos)
# index = random.randint(0, chars_len - 1)
code += all_chars[index]
return code
def main():
for _ in range(10): # 調用10次
print(generate_code(4))
if __name__ == '__main__':
main()
- 5 sub的使用
import re
# sub - substitute - 替換
#匹配到的話,替換匹配到的東西
def main():
#sentence1 = '某?東你個煞筆我草你大媽二姑三姨媽四舅媽,日你姥姥的,Fuck your Milk妹'
# |---表示分支
#pure_sent = re.sub('[草操屮日]|某?東|煞筆|fuck|shit', '*', sentence1, flags=re.IGNORECASE)
# pure -- 過濾之後的句子 flags= 正則表達式的匹配標記---忽略大小寫 flags=re.IGNORECASE 或者flags=re.I
#print(pure_sent)
# split 拆分 '\s ---'表示匹配任意空白字符
sentence2 = 'You go your way, I will go mine!'
mylist = re.split(r'[ ,!]', sentence2)
print(mylist)
if __name__ == '__main__':
main()
- 6 貪婪與懶惰匹配
import re
def main():
# 貪婪匹配 - a.*b
sentence1 = 'aabacddfbabajdfjskdfjdb'
m = re.match(r'a.*b', sentence1)
print(m)
print(m.group())
# 懶惰匹配
sentence2 = 'aabacddfbabajdfjskdfjdb'
m = re.match(r'a.*?b', sentence2)
print(m)
print(m.group())
if __name__ == '__main__':
main()