貪婪與非貪婪
- 什么是非貪婪:在正則中控制匹配不確定次數的符號后邊可以加?,來表示盡可能少的匹配
注意:盡可能少是在能夠匹配到的前提下盡可能少
*?
+?
?
{M,}?
{M,N}?
{,N}?
def main():
print(re.search('\d+', 'abchs3482==sdd'))
print(re.search('\d+?', 'abchs3482==sdd'))
print(re.search(r'"name":".*?"', '=======,"name":"mary","age":18,"愛好":"編程"'))
if __name__ == '__main__':
main()
2.在貪婪的時候,匹配是盡可能多的匹配
正則表達式的re模塊
- compile(正則表達式):將正則表達式轉換成正則對象
- 編譯后可以直接通過對象調用相關的對象方法
re_object = re.compile(r'\d{3}')
print(re_object)
re_object.fullmatch('432')
- fullmatch(正則表達式,字符串) --> 讓字符串和正則表達式完全匹配,匹配成功返回匹配對象,匹配失敗返回None
- 應用:檢測字符串內容是否符合要求,例如:檢測賬號、密碼、判斷手機號、身份證號是否合法
result = re.fullmatch(r'(\d{3})=([a-z]+)', '432=sjfg')
print(result)
# 匹配對象
# 1).span - 匹配到的字符串在原字符串中的下標范圍(結果是元祖)
print(result.span()) # 獲取整個正則表達式匹配到的內容的范圍
start, end = result.span()
print(start, end)
print(result.span(1)) # 獲取正則表達式中第一個分組匹配到的內容的范圍
# 2). start和end - 匹配到的字符串在原字符串中的開始下標和結束下標
print(result.start(), result.end())
# 3).group - 獲取匹配到的字符串(結果是字符串)
print(result.group()) # 獲取整個正則匹配到的字符串
print(result.group(1)) # 獲取第一個分組匹配到的字符串
print(result.group(2)) # 獲取第二個分組匹配到的字符串
print(result.groups()) # 同時獲取所有元祖匹配到的字符串(結果是元祖)
# 4). string - 獲取原字符串
print(result.string)
- match(正則表達式,字符串) -> 讓字符串的開頭和正則表達式進行匹配,匹配成功結果是匹配對象,否則是None
print(re.match(r'\D\d', 's3783khks==323'))
- search(正則表達式,字符串) -> 在字符串中去匹配出第一個符合正則表達式的子串,匹配成功結果是匹配對象,否則是None
print(re.search(r'[\u4e00-\u9fa5]{3}', 'hsj你的 方法給他,dsd得我'))
- split(正則表達式,字符串) -> 將字符串按照滿足正則要求的字符串進行切割(返回值是列表)
print(re.split(r'\d+', 'assdfs23fdgd3243fgfdvgdf=d-fef3fr'))
- sub(正則表達式,字符串1,字符串2) -> 將字符串2中能夠和正則表達式匹配的子串替換成字符串1,產生一個新的字符串
print(re.sub(r'\d+', '*', 'sjkf23jfdkjfd3234'))
print(re.sub(r'[傻逼]|傻|艸|[fuck]', '*', '你是傻逼嗎?我艸!fuck'))
- findall(正則表達式,字符串) -> 在字符串獲取滿足正則表達式的所有的字符串(結果是列表)
- 注意:如果正則表達式中有分組,直接獲取到的是分組中匹配到的內容;
- 如果有多個分組列表中的元素是元祖
print(re.findall(r'\d+[a-z]', 'assdfs23fdgd3243fgfdvgdf=d-fef3fr'))
print(re.findall(r'(\d+)([a-z])', 'assdfs23fdgd3243fgfdvgdf=d-fef3fr'))
- finditer(正則表達式,字符串) -> 字符串中獲取滿足正則表達式的所有的子串(結果是迭代器)
result = re.finditer(r'\d+', 'assdfs23fdgd3243fgfdvgdf=d-fef3fr')
print(result)
print(next(result).group())
- re.I --> 忽略大小寫
- 匹配的約束條件是放在函數的flag參數中的
print(re.fullmatch(r'[a-z]{2}', 'HZ', re.I))
練習:驗證輸入的QQ號是否有效并給出對應的提示信息
要求:
用戶名必須有字母、數字
user = r'[a-z]'
QQ_str = 2061633184
print(re.fullmatch(r'[1-9]\d{4,11}', str(QQ_str)))
Pygame
游戲基本框架
import pygame
def base_game():
# 1.初始化pygame,做準備工作
pygame.init()
# 2.創建游戲窗口
"""
set_mode(窗口大小) == set_mode((寬,高)) - 會返回一個surface類型的對象
窗口大小對應的是一個元祖
"""
window = pygame.display.set_mode((400, 600))
# 設置窗口標題
pygame.display.set_caption('游戲')
# 設置窗口背景顏色
"""
fill(顏色)
顏色是一個元祖,元祖有三個int類型的元素,返回時0-255;分別代表R,G,B
計算機三原色:紅、綠、藍
紅色(255,0,0)
綠色(0,255,0)
藍色(0,0,255)
白色(255,255,255)
黑色(0,0,0)
"""
window.fill((255, 255, 0))
pygame.display.flip()
# 3.讓游戲保持運行狀態(游戲循環)
while True:
# 不斷檢測游戲過程中是否有時間的產生
# 這個循環會阻塞線程。
for event in pygame.event.get():
# 只有當時間產生后才會進入for循環
if event.type == pygame.QUIT:
return
# 退出
# exit()
def main():
base_game()
if __name__ == '__main__':
main()
添加圖片
import pygame
def main():
# 1.初始化
pygame.init()
# 2.創建窗口
window = pygame.display.set_mode((400, 600))
pygame.display.set_caption('圖片')
window.fill((255, 255, 255, 255))
# 3.添加固定顯示內容
"""
顯示圖片
1.加載圖片
image.load(圖片地址) --> 返回圖片對象(surface)
2.將圖片添加(渲染)到窗口上
blit(渲染對象,坐標)
坐標:一個元祖,兩個元素,分別是x坐標和y坐標
"""
image = pygame.image.load('images/食尸鬼.jpg')
window.blit(image, (0, 0))
# 4.操作圖片
"""
1.獲取圖片對象大小
surface類型有個對象方法:get_size()
"""
# 獲取窗口大小
print(window.get_size())
# 獲取圖片大小
print(image.get_size())
width, height = image.get_size()
"""
2.圖片縮放和旋轉(形變)
transform.scale(縮放對象,目標大小) --> 返回縮放后的對象
transform.rotozoom(縮放對象,旋轉角度,縮放比例)
"""
new_image = pygame.transform.scale(image, (250, 200))
new_image = pygame.transform.rotozoom(image, -30, 0.5)
window.blit(new_image, (60, 200))
new_image = pygame.transform.rotozoom(image, 30, 0.5)
window.blit(new_image, (75, 100))
new_image = pygame.transform.rotozoom(image, 60, 0.5)
window.blit(new_image, (75, 50))
pygame.display.flip()
# 3.游戲循環
while True:
# 時間檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if __name__ == '__main__':
main()
顯示文字
import pygame
def main():
# 1.初始化
pygame.init()
# 2.創建窗口
window = pygame.display.set_mode((400, 600))
pygame.display.set_caption('圖片')
window.fill((255, 255, 255))
# ==========顯示文字===================
"""
1.創建字體對象
a.系統字體
font.SysFont(字體名,字體大小)
b.自定義字體
font.Font(字體文件路徑,字體大小)
"""
# font = pygame.font.SysFont('Times', 40)
font = pygame.font.Font('images/font2.ttf', 40)
"""
2.根據字體創建文字對象
render(文字,True,文字顏色) --> 返回一個文字對象(Surface)
"""
text = font.render('hello世界', True, (255, 0, 0))
w, h = text.get_size()
"""
3.顯示文字
blit(渲染對象,坐標)
"""
window.blit(text,(400-w, 600-h))
pygame.display.flip()
# 3.游戲循環
while True:
# 時間檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if __name__ == '__main__':
main()
圖形
import pygame,math
def main():
# 1.初始化
pygame.init()
# 2.創建窗口
window = pygame.display.set_mode((400, 600))
pygame.display.set_caption('圖片')
window.fill((255, 255, 255, 255))
# =============畫圖形=================
# 1.畫線
"""
line(畫在哪個地方,線的顏色,起點,終點,線寬=1)
"""
pygame.draw.line(window, (0, 255, 0), (10, 10), (100, 100), 10)
# 2.畫五角星
point_list = [(200, 200), (250, 50), (300, 200), (150, 100), (350, 100)]
# pygame.draw.lines(window, (255, 0, 0), True, point_list)
# 3.畫圓
"""
circle(畫在哪個地方,線的顏色,圓心,半徑,線寬=0)
"""
pygame.draw.circle(window,(0,0,0),(200,300),100,0)
pygame.draw.circle(window,(255,0,0),(200,300),90,0)
# 4.畫多邊形
pygame.draw.polygon(window, (255, 0, 0), point_list,0)
# 5.畫弧線
"""
arc(畫在哪個地方,線的顏色,矩形,起始弧度,終止弧度,線寬)
"""
pygame.draw.arc(window, (0, 255, 255), (100, 470, 50, 200), math.pi/4, math.pi/4*3, 5)
# 6.畫矩形
pygame.draw.rect(window, (100, 20, 50), (200, 470, 100, 50), 2)
pygame.display.flip()
# 3.游戲循環
while True:
# 時間檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if __name__ == '__main__':
main()