一佣赖、正則表達式
什么是非貪婪:在正則中控制匹配不確定次數的符號后邊可以加?,來表示盡可能少的匹配
在貪婪的時候熊痴,匹配是盡可能多的匹配
注意:盡可能少是在能夠匹配到的前提下盡可能少
*?
+?
??
{M,}?
{N,M}?
{,N}?
import re
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, "愛好":"編程",....'))
if __name__ == '__main__':
main()
1. compile(正則表達式) -> 將正則表達式轉換成正則對象
編譯后可以直接通過對象調用相關的對象方法
re_object = re.compile(r'\d{3}')
re_object.fullmatch('432')
2. fullmatch(正則表達式, 字符串) -> 讓字符串和正則表達式完全匹配茧痕,匹配成功返回匹配對象,匹配失敗返回None
應用:檢測字符串內容是否符合要求,例如:檢測賬號喊递、密碼冰垄、判斷手機號、身份證號等是否合法
result = re.fullmatch(r'(\d{3})=([a-z]+)', '342=sjaks')
print(result)
匹配對象
1).span() - 匹配到的字符串在原字符串中的下標范圍(結果是元素)
print(result.span()) # 獲取整個正則表達式匹配到的內容的范圍
# start, end = result.span()
# print(start, end)
print(result.span(1)) # 獲取正則表達式中第一個分組匹配到的內容的范圍
print(result.span(2)) # 獲取正則表達式中第二個分組匹配到的內容的范圍
2). start()和end() - 匹配到的字符串在原字符串中的開始下標和結束下標
print(result.start(), result.end())
print(result.start(1), result.start(2))
3). group() - 獲取匹配到的字符串(結果是字符串)
print(result.group()) # 獲取整個正則匹配到的字符串
print(result.group(1)) # 獲取第一個分組匹配到的字符串
print(result.group(2)) # 獲取第二個分組匹配到的字符串
print(result.groups()) # 同時獲取所有分組匹配到的字符串(結果是元祖)
4). string - 獲取原字符串
print(result.string)
3.match(正則表達式,字符串) -> 讓字符串的開頭和正則表達式進行匹配捻勉,匹配成功結果是匹配對象镀梭,否則是None
print(re.match(r'\D\d', 's3skjkjks'))
4.search(正則表達式,字符串) -> 在字符串中去匹配出第一個符合正則表達式的子串, 匹配成功結果是匹配對象,否則是None
print(re.search(r'[\u4e00-\u9fa5]{3}', 'hsj后視ss023你好嗎,skss上的30s'))
5.split(正則表達式,字符串) -> 將字符串按照滿足正則要求的子串進行切割(返回值是列表)
print(re.split(r'\d+', 'asj38jkas0093kjsj78kajs89==asdfj3jkkss'))
6.sub(正則表達式,字符串1, 字符串2) -> 將字符串2中能夠和正則表達式匹配的子串替換成字符串1,產生一個新的字符串
print(re.sub(r'\d+', '*', 'jsj93jksj93j5a45s3s是看得見'))
print(re.sub(r'傻逼|[傻艸草操]', '*', '你是傻逼嗎踱启?艸!'))
7.findall(正則表達式, 字符串) -> 在字符串中獲取滿足正則表達式的所有的子串(結果是列表)
注意: 如果正則表達式中有分組报账,直接獲取到的是分組中匹配到的內容; 如果有多個分組列表中的元素是元祖
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(正則表達式, 字符串) -> 在字符串中獲取滿足正則表達式的所有的子串(結果是迭代器,元素是匹配對象)
result = re.finditer(r'(\d+)[a-z]', 'sj8khk83jks數據310sj=sd')
print(result)
print(next(result).group())
9.re.I -> 忽略大小寫
匹配的約束條件是放在函數的flags參數中的
print(re.fullmatch(r'[a-z]{2}', 'SA', re.I))
練習
驗證輸入用戶名和QQ號是否有效并給出對應的提示信息
要求:
用戶名必須由字母、數字或下劃線構成且長度在6~20個字符之間
QQ號是5~12的數字且首位不能為0
re_str1 = r'[a-zA-Z\d_]{6,20}'
re_str2 = r'[1-9]\d{4,11}'
二埠偿、Pygame
1.游戲基本框架
import pygame
def base_game():
# 1.初始化pygame, 做準備工作
pygame.init()
# 2.創(chuàng)建游戲窗口
"""
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, 255))
# 想要對窗口內容進行的修改有效抖剿,必須執(zhí)行以下操作
pygame.display.flip()
# 3.讓游戲保持運行狀態(tài)(游戲循環(huán))
while True:
# 4.不斷檢測游戲過程中是否有事件的產生
for event in pygame.event.get():
# 只有當事件產生后才會進入for循環(huán)
# print('======')
if event.type == pygame.QUIT:
# return
# 退出!
exit()
def main():
base_game()
if __name__ == '__main__':
main()
2.顯示圖片
import pygame
def main():
# 1.初始化
pygame.init()
# 2.創(chuàng)建窗口
window = pygame.display.set_mode((400, 600))
pygame.display.set_caption('圖片')
window.fill((255, 255, 255))
# 3.添加固定顯示內容
"""
顯示圖片
1.加載圖片
image.load(圖片地址) -> 返回圖片對象(surface)
2.將圖片添加(渲染)到窗口上
blit(渲染對象, 坐標)
坐標: 一個元祖朽寞,兩個元素,分別是x坐標和y坐標
"""
image = pygame.image.load('images/luffyy.png')
window.blit(image, (0, 0))
# 4.操作圖片
"""
1.獲取圖片對象大小
surface類型有個對象方法: get_size() - 返回的是元祖
"""
# 獲取窗口大小
print(window.get_size())
# 獲取圖片大小
print(image.get_size())
width, height = image.get_size()
# window.blit(image, (400-width, 600-height))
"""
2.圖片縮放和旋轉(形變)
transform.scale(縮放對象, 目標大小) -> 返回縮放后的新對象
transform.rotozoom(縮放對象, 旋轉角度, 縮放比例)
"""
new_image = pygame.transform.scale(image, (50, 50))
new_image = pygame.transform.rotozoom(image, 45, 0.8)
window.blit(new_image, (10, 250))
pygame.display.flip()
# 3.游戲循環(huán)
while True:
# 事件檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if __name__ == '__main__':
main()
3.顯示文字
import pygame
def base_game():
# 1.初始化pygame, 做準備工作
pygame.init()
# 2.創(chuàng)建游戲窗口
window = pygame.display.set_mode((400, 600))
# 設置窗口標題
pygame.display.set_caption('游戲')
# 設置窗口背景顏色
window.fill((255, 255, 255))
# ============顯示文字===========
"""
1.創(chuàng)建字體對象
a.系統字體
font.SysFont(字體名, 字體大小) - 返回一個字體對象
b.自定義字體
font.Font(字體文件路徑, 字體大小)
"""
# font = pygame.font.SysFont('Times', 40)
font = pygame.font.Font('images/font2.ttf', 40)
"""
2.根據字體創(chuàng)建文字對象
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))
# 想要對窗口內容進行的修改有效斩郎,必須執(zhí)行以下操作
pygame.display.flip()
# 3.讓游戲保持運行狀態(tài)(游戲循環(huán))
while True:
# 4.不斷檢測游戲過程中是否有事件的產生
for event in pygame.event.get():
# 只有當事件產生后才會進入for循環(huán)
# print('======')
if event.type == pygame.QUIT:
# return
# 退出!
exit()
def main():
base_game()
if __name__ == '__main__':
main()
4.圖形
import pygame
import math
import random
def base_game():
pygame.init()
window = pygame.display.set_mode((400, 600))
pygame.display.set_caption('游戲')
window.fill((255, 255, 255))
# ============畫圖形=============
# 1.畫線
"""
line(畫在哪個地方, 線的顏色, 起點, 終點, 線寬=1)
"""
pygame.draw.line(window, (0, 255, 0), (10, 10), (100, 100), 4)
# 2.畫線
"""
lines(畫在哪個地方, 線的顏色, 是否關閉, 點列表, 線寬=1)
"""
point_list = [(200, 200), (250, 10), (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.畫多邊形
"""
polygon(畫在哪個地方,線的顏色, 點列表,線寬)
"""
pygame.draw.polygon(window, (255, 0, 0), point_list, 0)
# 5.畫弧線
"""
arc(畫在哪個地方,線的顏色, 矩形, 起始弧度, 終止弧度, 線寬)
"""
pygame.draw.arc(window, (0, 255, 255), (10, 470, 150, 200), math.pi/4, math.pi/4*3, 5)
# 6.畫矩形
pygame.draw.rect(window, (100, 20, 50), (200, 470, 100, 50), 2)
window.fill((255, 255, 255))
pygame.display.flip()
point_list = []
flag = False
while True:
# 4.不斷檢測游戲過程中是否有事件的產生
for event in pygame.event.get():
# 只有當事件產生后才會進入for循環(huán)
# print('======')
if event.type == pygame.QUIT:
# return
# 退出!
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
flag = True
point_list = []
elif event.type == pygame.MOUSEBUTTONUP:
flag = False
# window.fill((255, 255, 255))
elif event.type == pygame.MOUSEMOTION:
point_list.append(event.pos)
# print(point_list)
if len(point_list) < 2:
break
if flag:
pygame.draw.lines(window, (255, 0, 0), False, point_list, 3)
pygame.display.flip()
def main():
base_game()
if __name__ == '__main__':
main()