一.正則表達(dá)式
1.什么是非貪婪:在正則中控制匹配不確定次數(shù)的符號后邊可以加?,來表示盡可能少的匹配
在貪婪的時候,匹配是盡可能多的匹配
注意:盡可能少是在能夠匹配到的前提下盡可能少
*?
+?
??
{M,}?
{N,M}?
{,N}?
def main():
print(re.search(r'\d+', 'abchs3482==sdd'))
print(re.search(r'\d+?', 'abchs3482==sdd'))
print(re.search(r'"name":".*?",', '====,"name":"yuting","age":18, "愛好":"編程",....'))
二.正則的相關(guān)方法
- compile(正則表達(dá)式) -> 將正則表達(dá)式轉(zhuǎn)換成正則對象
編譯后可以直接通過對象調(diào)用相關(guān)的對象方法
re_object = re.compile(r'\d{3}')
re_object.fullmatch('432')
- fullmatch(正則表達(dá)式, 字符串) -> 讓字符串和正則表達(dá)式完全匹配晨仑,匹配成功返回匹配對象褐墅,匹配失敗返回None
應(yīng)用:檢測字符串內(nèi)容是否符合要求,例如:檢測賬號拆檬、密碼、判斷手機(jī)號妥凳、身份證號等是否合法
result = re.fullmatch(r'(\d{3})=([a-z]+)', '342=sjaks')
print(result)
匹配對象
1).span() - 匹配到的字符串在原字符串中的下標(biāo)范圍(結(jié)果是元素)
print('====span====')
print(result.span()) # 獲取整個正則表達(dá)式匹配到的內(nèi)容的范圍
start, end = result.span()
print(start, end)
print(result.span(1)) # 獲取正則表達(dá)式中第一個分組匹配到的內(nèi)容的范圍
print(result.span(2)) # 獲取正則表達(dá)式中第二個分組匹配到的內(nèi)容的范圍
2). start()和end() - 匹配到的字符串在原字符串中的開始下標(biāo)和結(jié)束下標(biāo)
print('====start名竟贯,end====')
print(result.start(), result.end())
print(result.start(1), result.start(2))
3). group() - 獲取匹配到的字符串(結(jié)果是字符串)
print(result.group()) # 獲取整個正則匹配到的字符串
print(result.group(1)) # 獲取第一個分組匹配到的字符串
print(result.group(2)) # 獲取第二個分組匹配到的字符串
print(result.groups()) # 同時獲取所有分組匹配到的字符串(結(jié)果是元祖)
4). string - 獲取原字符串
print(result.string)
3.match(正則表達(dá)式,字符串) -> 讓字符串的開頭和正則表達(dá)式進(jìn)行匹配,匹配成功結(jié)果是匹配對象逝钥,否則是None
print(re.match(r'\D\d', 's3skjkjks'))
4.search(正則表達(dá)式,字符串) -> 在字符串中去匹配出第一個符合正則表達(dá)式的子串, 匹配成功結(jié)果是匹配對象,否則是None
print(re.search(r'[\u4e00-\u9fa5]{3}', 'hsj后視ss023你好嗎,skss上的30s'))
5.split(正則表達(dá)式,字符串) -> 將字符串按照滿足正則要求的子串進(jìn)行切割(返回值是列表)
print(re.split(r'\d+', 'asj38jkas0093kjsj78kajs89==asdfj3jkkss'))
6.sub(正則表達(dá)式,字符串1, 字符串2) -> 將字符串2中能夠和正則表達(dá)式匹配的子串替換成字符串1屑那,產(chǎn)生一個新的字符串
print(re.sub(r'\d+', '*', 'jsj93jksj93j5a45s3s是看得見'))
print(re.sub(r'傻逼|[傻艸草操]', '*', '你是傻逼嗎?艸!'))
7.findall(正則表達(dá)式, 字符串) -> 在字符串中獲取滿足正則表達(dá)式的所有的子串(結(jié)果是列表)
注意: 如果正則表達(dá)式中有分組艘款,直接獲取到的是分組中匹配到的內(nèi)容; 如果有多個分組列表中的元素是元
print(re.findall(r'\d+[a-z]', 'sjh83bkss93ksjhf9922'))
print(re.findall(r'(\d+)[a-z]', 'sjh83bkss93=sjhf9922'))
print(re.findall(r'abc(\d{2}|[A-Z]{2})', '=-aaabc73kkjabcKJL=3'))
8.finditer(正則表達(dá)式, 字符串) -> 在字符串中獲取滿足正則表達(dá)式的所有的子串(結(jié)果是迭代器,元素是匹配對象)
result = re.finditer(r'(\d+)[a-z]', 'sj8khk83jks數(shù)據(jù)310sj=sd')
print(result)
print(next(result).group())
9.re.I -> 忽略大小寫
匹配的約束條件是放在函數(shù)的flags參數(shù)中
print(re.fullmatch(r'[a-z]{2}', 'SA', re.I))
練習(xí)
驗證輸入用戶名和QQ號是否有效并給出對應(yīng)的提示信
要求:
用戶名必須由字母持际、數(shù)字或下劃線構(gòu)成且長度在6~20個字符之間
QQ號是5~12的數(shù)字且首位不能為0
re_str1 = r'[a-zA-Z\d_]{6,20}'
re_str2 = r'[1-9]\d{4,11}'
三.pygame
import pygame
導(dǎo)入pygame模塊
def base_game():
# 1.初始化pygame, 做準(zhǔn)備工作
pygame.init()
# 2.創(chuàng)建游戲窗口
set_mode(窗口大小) == set_mode((寬, 高)) - 會返回一個surface類型的對象
窗口大小對應(yīng)的值是一個元祖
window = pygame.display.set_mode((400, 600))
# 設(shè)置窗口標(biāo)題
pygame.display.set_caption('游戲')
# 設(shè)置窗口背景顏色
"""
fill(顏色)
顏色是一個元祖,元祖有三個int類型的元素哗咆,返回是0~255蜘欲;分別代表R,G,B
計算機(jī)三原色: 紅、綠晌柬、藍(lán)
紅色 (255, 0, 0)
綠色 (0, 255, 0)
藍(lán)色 (0, 0, 255)
白色 (255, 255, 255)
黑色 (0, 0, 0)
"""
window.fill((255, 255, 255))
# 想要對窗口內(nèi)容進(jìn)行的修改有效姥份,必須執(zhí)行以下操作
pygame.display.flip()
# 3.讓游戲保持運(yùn)行狀態(tài)(游戲循環(huán))
while True:
# 4.不斷檢測游戲過程中是否有事件的產(chǎn)生
for event in pygame.event.get():
# 只有當(dāng)事件產(chǎn)生后才會進(jìn)入for循環(huán)
# print('======')
if event.type == pygame.QUIT:
# return
# 退出!
exit()
def main():
base_game()
if __name__ == '__main__':
main()