python办公自动化(入门)
python辦公自動化(入門)
持久化:內存(不能長時間保存數據)到硬盤(可以長時間保存數據)
文件系統:存儲和管理數據的一種方式
格式化硬盤的時候就是在創建一個文件系統
open()函數
在python中使用操作文件之前,需要使用open()打開文件,其會返回一個文件對象。
下面時open函數的參數列表:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)file:要創建或者打開的文件。通常為:文件路徑/文件名.文件格式
mode:可選參數,指定文件的打開模式,默認為只讀的方式打開
buffering:可選參數,用于設置緩沖策略。具體操作在進階里面說
encoding:可選參數,用于解碼或編碼的編碼名稱文件
errors:可選參數,errors是一個可選字符串,用于指定如何處理編碼錯誤。這個參數不應該在二進制模式下使用
newline:可選參數,控制通用換行符的工作方式
closefd:默認值值為True,如果closefd為False,底層文件描述符將保持打開狀態當文件關閉時。當給定了文件名時,這就不起作用了并且在這種情況下必須為真
文件的操作模式(mode參數)有如下幾種:
| r | 讀取 (默認) |
| w | 寫入(會先截斷之前的內容) |
| x | 寫入,如果文件已經存在會產生異常 |
| a | 追加,將內容寫入到已有文件的末尾 |
| b | 二進制模式 |
| t | 文本模式(默認) |
| + | 更新(既可以讀又可以寫) |
這里我們只需要先了解file、mode、encoding這三個參數
讀取文件內容
致橡樹.txt 文檔
# 返回一個文件對象 file = open(file ='致橡樹.txt', mode ='r', encoding ='utf-8')# 讀取所有內容 print(file.read()) # 切記,每次打開文件之后一定要關閉文件,不然文件會一直占用緩存 file.close()'r’以只讀的方式打開,同時選取utf-8作為文件的編碼方式(我的編譯器編碼方式為utf-8,而致橡樹.txt文件的編碼方式為gbk,所以需要把文檔的編碼改為utf-8)
如何查看編譯器編碼:
import sysprint(sys.getdefaultencoding()) # 查看文件編碼這里有一個問題,就是如果在文件關閉之前,前面的代碼出現錯誤,從而導致無法執行文件關閉的語句,這樣怎么辦呢?
這里我們可以使用一個異常處理語句try-finally,無論try語句里面的內容是否出現異常,始終都會執行finally語句塊里面的內容。
代碼如下:
# 返回一個文件對象 file = open(file ='致橡樹.txt', mode ='r', encoding ='utf-8')try:# 讀取所有內容print(file.read()) finally:# 關閉文件file.close()print('關閉文件成功')以后我們都將使用上面這個格式去操作文件。
當一個文件很大時,這里將耗費很多時間和緩存,我們可以分批次讀取
# 返回一個文件對象 file = open(file ='致橡樹.txt', mode ='r', encoding ='utf-8')try:# 一次只讀32個字節,讀不到數據則返回Nonedata = file.read(32)while data:print(data, end = '')data = file.read(32) finally:# 關閉文件file.close()print('關閉文件成功')寫入內容
如果要向文件中寫入內容,我們需要將文件的打開模式改為a或者w
這里我們打開一個新的空白文件(文件不存在就在當前路徑下創建一個新文檔)
這里我們文件打開模型選擇為w,為只讀模式,我不能對其進行讀操作。
# 打開 小雨康橋的詩.txt 文件 file = open('小雨康橋的詩.txt', mode = 'w', encoding = 'utf-8')try:# 寫入內容file.write('我只想做燕子\n')file.write('只需簡單思想\n')file.write('只求風中流浪\n')file.write('我想作樹\n')file.write('不想長五臟六腑\n')file.write('不會肝腸寸斷\n') finally:# 關閉文件file.close()print('關閉文件成功')如果我們還行在文件后面繼續寫入文件,我們可以進行如下操作
# 打開 小雨康橋的詩.txt 文件 將文件操作模式設置為a file = open('小雨康橋的詩.txt', mode = 'a', encoding = 'utf-8')try:# 寫入內容file.write('我做不成燕子\n')file.write('所以我飛不過感情的墻\n')file.write('我做不成樹\n')file.write('因此也撐不破傷心的網\n') finally:# 關閉文件file.close()print('關閉文件成功')讀寫二進制文件
先給大家介紹一個函數seek()。我們可以使用它移動文件指針到指定位置,然后進行讀寫。
seek(移動字節數,移動模式):
移動模式有三種,如下:
0:默認的模式,以文件開頭為初始點移動移動指針;
1:以當前指針所在位置為初始點移動指針;
2:以文件末尾為初始位置移動指針;
強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
實例:
file = open('小雨康橋的詩.txt', mode = 'w', encoding = 'utf-8') try:# 打印當前文件指針的位置print(file.tell()) # 200# 將文件指針移到開頭file.seek(0, 0)print(file.tell()) # 0# 將文件指針移到第八個字節file.seek(8, 0) print(file.tell()) # 8 finally:file.close()這里我們文件的操作模式為w,所以不能使用seek(n,1) 、seek(n, 2) (n表示移動字節數)
以二進制形式打開文件,以圖片為例,該圖片為一個截圖
# 導入模塊,模塊作用如下 from io import SEEK_END, SEEK_SET# 讀取一個圖片,以二進制的模打開 file = open(file = 'image.jpg', mode = 'rb')# 移動文件指針至文件末尾,獲取文件長度 file.seek(0, SEEK_END)# 通過tell方法獲取文件指針移動的字節數,這個字節數就是文件的大小 print(file.tell())# 將文件指針移動到最初的位置 file.seek(0, SEEK_SET)try:data = file.read(512)while data:print(data, end = '')data = file.read() finally:file.close()print('關閉文件')上下文語法
對于open函數,我們還可以用with上下文語法,使用with上下文語法會在結束文件操作之后,會自動保存文件,這樣我們就不需要再寫finally語句在執行close方法了,讓代碼變得更簡潔。不過并不是所有的對象都可以使用with上下文語法,必須符合上下文管理器協議的對象(有__enter__和__exit__魔術方法)才可以使用。
實例:
# 讀文件 with open('小雨康橋的詩.txt', 'r', encoding = 'utf-8-sig') as file:# 輸出文件內容print(file.read())# 寫文件 with open('小雨康橋的詩.txt', 'a', encoding = 'utf-8-sig') as file2:# 寫入內容file2.write('我做不成燕子\n')file2.write('所以我飛不過感情的墻\n')file2.write('我做不成樹\n')file2.write('因此也撐不破傷心的網\n')讀寫CSV文件
CSV(Comma Separated Values)全稱逗號分隔值文件。接下來將使用python對CSV文件進行操作。這里我們需要導入python中的csv模塊。
csv這里我們主要介紹兩個方法,
csv.reader:返回一個遍歷 CSV 文件各行的讀取對象(已經讀取文件中的所有數據)
csv.writer:將數據寫入CSV的寫入對象
讀取csv文件
import csvwith open('2018年北京積分落戶數據2.csv', encoding = 'gb18030') as file:# 每次讀取文件的一行content = file.readline()while content:# 對讀取的數據進行處理,將換行符\n去掉,并且用逗號分隔values = content.replace('\n', '').split(',')print(values)# 讀取下一行數據content = file.readline()還可以通過delimiter、quotechar參數來指定分隔符(默認是英文的逗號)、包圍值的字符(默認是英文雙引號)。其中,包圍值的字符主要用于當字段中有特殊符號時,通過添加包圍值的字符可以避免二義性。
with open('2018年北京積分落戶數據2.csv', encoding = 'gb18030') as file:# delimiter:設置分隔符(默認是英文的逗號)# quotechar:包裹字符串符號(默認是英文雙引號)reader = csv.reader(file, delimiter = '#', quotechar = '@')for row in reader:print(row)將數據寫入csv文件中
import csv import randomwith open('成績.csv', 'w', encoding = 'utf-8-sig', newline = "") as file:writer = csv.writer(file)# 在文件中寫入內容writer.writerow(['姓名', '語文成績', '數學成績', '英語成績'])names = ['小明', '大毛', '二毛']# 循環遍歷,隨機生成三人的各科成績for i in range(3):subject1 = random.randrange(50, 101)subject2 = random.randrange(60, 101)subject3 = random.randrange(40, 101)# 寫入文件writer.writerow([names[i], subject1, subject2, subject3])讀寫Excel文件
讀寫Excel文件,我們需要使用一些python的第三方庫:
xlrd / xlwt :讀取 / 寫入,二者兼容低版本的Excel文件(后綴名為xls)
xlutils:支持同時對Excel文件進行讀操作和寫入操作
openpyxl:獲取Excel對象,兼容高版本的Excel文件(后綴名為xlsx)
讀取Excel文件
import xlrd# 每個Excel文件都是一個工作簿(workbook),每個工作簿包含1個或1個以上的工作表(sheet) # 獲取工作簿 wb = xlrd.open_workbook('阿里巴巴2020年股票數據.xls') print(type(wb))# 獲取所有工作表的名字 print(wb.sheet_names())# 獲取指定的工作表 sheet = wb.sheet_by_name('股票數據') # 方法一 sheet2 = wb.sheet_by_index(0) # 方法二 print(type(sheet))# 獲取工作表的行數和列數 print(sheet.nrows, sheet.ncols)# 獲取指定的行 print(sheet.row(0)) print(sheet.row_slice(0, start_colx=0, end_colx=3))# 獲取指定的列 print(sheet.col(4)) print(sheet.col_slice(4, start_rowx=1, end_rowx=11))# 獲取單元格的數據 cell = sheet.cell(2, 2) print(type(cell)) print(cell.value)遍歷整個sheet,根據數據的格式,在遍歷的同時對數據進行處理
import xlrd# 工作簿 ---> 一個Excel文件 ---> Book wb = xlrd.open_workbook('resources/阿里巴巴2020年股票數據.xls')# 獲取指定的工作表 sheet = wb.sheet_by_index(0)# 原工作表中的表頭 print(f'交易日期\t\t\t最高價\t\t最低價\t\t開盤價\t\t收盤價\t\t成交量\t\t調整收盤價')for row in range(1, sheet.nrows):for col in range(sheet.ncols):value = sheet.cell(row, col).value# 第一列是時間數據,對時間進行一個格式化if col == 0:# year, month, date, *_ = xlrd.xldate_as_tuple(value, 0)# print(f'{year}年{month:0>2d}月{date:0>2d}日', end='\t')curr_date = xlrd.xldate_as_datetime(value, 0)print(curr_date.strftime('%Y年%m月%d日'), end='\t')elif col == 5:print(f'{int(value):<10d}', end='\t')else:print(f'{value:.4f}', end='\t')print()寫Excel文件
import randomimport xlwtnames = ['小明', '大毛', '二毛'] scores = [[random.randint(40, 100) for _ in range(3)] for _ in range(3)]# 創建工作簿對象(Workbook) wb = xlwt.Workbook()# 創建工作表對象(Worksheet) sheet = wb.add_sheet('五年級20班')# 添加表頭數據 titles = ('姓名', '語文成績', '數學成績', '英語成績') for index, title in enumerate(titles):# 在第0行,第index列,添加內容titlesheet.write(0, index, title)# 將學生姓名和考試成績寫入單元格 for row in range(len(scores)):sheet.write(row + 1, 0, names[row])for col in range(len(scores[row])):sheet.write(row + 1, col + 1, scores[row][col]) # 保存Excel工作簿 wb.save('考試成績表.xlsx')調整單元格樣式
我們還可以為單元格設置樣式,主要包括字體(Font)、對齊方式(Alignment)、邊框(Border)和背景(Background)的設置
import randomimport xlwtnames = ['小明', '大毛', '二毛'] scores = [[random.randint(40, 100) for _ in range(3)] for _ in range(3)]# 創建工作簿對象(Workbook) wb = xlwt.Workbook()# 創建工作表對象(Worksheet) sheet = wb.add_sheet('五年級20班')# 將表頭單元格的背景色修改為藍色 header_style = xlwt.XFStyle() pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN # 0-黑色、1-白色、2-紅色、3-綠色、4-藍色、5-黃色、6-粉色、7-青色 pattern.pattern_fore_colour = 4 header_style.pattern = pattern# 為表頭設置指定的字體 font = xlwt.Font() # 字體名稱 font.name = '華文楷體' # 字體大小(20是基準單位,18表示18px) font.height = 20 * 18 # 是否使用粗體 font.bold = True # 是否使用斜體 font.italic = False # 字體顏色 font.colour_index = 1 header_style.font = font# 表頭垂直居中對齊 align = xlwt.Alignment() # 垂直方向的對齊方式 align.vert = xlwt.Alignment.VERT_CENTER # 水平方向的對齊方式 align.horz = xlwt.Alignment.HORZ_CENTER header_style.alignment = align# 給表頭加上紅色的虛線邊框 borders = xlwt.Borders() props = (('top', 'top_colour'), ('right', 'right_colour'),('bottom', 'bottom_colour'), ('left', 'left_colour') ) # 通過循環對四個方向的邊框樣式及顏色進行設定 for position, color in props:setattr(borders, position, xlwt.Borders.DASHED)setattr(borders, color, 2) header_style.borders = borders# 調整單元格的寬度(列寬)和表頭的高度(行高) # 設置行高為40px sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}')) titles = ('姓名', '語文', '數學', '英語') for index, title in enumerate(titles):# 設置列寬為1500pxsheet.col(index).width = 20 * 150# 添加表頭數據 titles = ('姓名', '語文成績', '數學成績', '英語成績') for index, title in enumerate(titles):sheet.write(0, index, title, header_style)# 將學生姓名和考試成績寫入單元格 for row in range(len(scores)):sheet.write(row + 1, 0, names[row])for col in range(len(scores[row])):sheet.write(row + 1, col + 1, scores[row][col]) # 保存Excel工作簿 wb.save('考試成績表.xlsx')簡單計算
計算剛才的考試成績表.xlsx里面每個人的平均成績
# 計算考試成績.xls文件中每個人的平均成績 import xlrd import xlwt from xlutils.copy import copywb1 = xlrd.open_workbook('考試成績表.xls')# 不改變原數據,將元數據拷貝在另外一個表中 wb2 = copy(wb1) # type: xlwt.Workbook sheet = wb2.get_sheet(0) sheet.write(0, 4, '平均分') for row_index in range(1, 4):sheet.write(row_index, 4, xlwt.Formula(f'average(B{row_index + 1}:D{row_index + 1})')) wb2.save('考試成績表—平均成績.xls')openpyxl讀取Excel文件
import openpyxl from datetime import datetime# 加載一個工作簿 wb = openpyxl.load_workbook('股票數據.xlsx') print(type(wb))# 獲取工作表的名字 print(wb.sheetnames)# 獲取工作表 # sheet = wb['股票數據'] sheet = wb.worksheets[0]# 工作表類型 print(type(sheet)) #<class 'openpyxl.worksheet.worksheet.Worksheet'># 工作表維度 print(sheet.dimensions) # A1:G255# 工作表的長度和寬度 print(sheet.max_row, sheet.max_column) # 255 7操作Word文檔
這里我們會用到兩個模塊python-docx、pillow,一個用于處理word文檔,一個用于處理圖像。
創建一個word文檔
from docx import Document from docx.shared import Inches from docx.document import Document as Doc# 創建一個Document對象 document = Document() # type:Doc# 添加一個標題 0 ,最高級標題 document.add_heading('三國', 0)# 添加段落 p = document.add_paragraph('三國(220年-280年)是中國歷史上位于漢朝之后、晉朝之前的一段歷史時期。\這一個時期,先后出現了曹魏、蜀漢、東吳三個主要政權。263年,蜀漢后主劉禪投降,\蜀漢被魏所滅。265年司馬昭去世,其子司馬炎奪取曹魏政權,定都洛陽,建立晉朝,\史稱西晉。280年司馬炎大舉進攻吳國,孫吳滅亡,西晉統一天下,至此,')p.add_run('近百年的戰亂結束,').bold = True # 加粗 p.add_run('三家歸晉。').italic = True # 斜體# 一級標題 document.add_heading('三國歷史簡介', level = 1) document.add_paragraph('人物簡介', style = 'Intense Quote')document.add_paragraph('曹魏陣營', style = 'List Bullet' ) document.add_paragraph('曹操:', style = 'List Number' ) document.add_paragraph('郭嘉:', style = 'List Number' )# 添加圖片 document.add_picture('三國.jpg', width = Inches(4))records = (('劉備', '男', '蜀漢'),('孫權', '男', '東吳'),('曹丕', '男', '曹魏'),('呂布', '男', '群雄') )# 添加一個表格 table = document.add_table(rows = 1, cols = 3) hdr_cells = table.rows[0].cells hdr_cells[0].text = '姓名' hdr_cells[1].text = '性別' hdr_cells[2].text = '勢力' for qty, id, desc in records:row_cells = table.add_row().cellsrow_cells[0].text = str(qty)row_cells[1].text = idrow_cells[2].text = descdocument.add_page_break()# 保存文檔,命名為 三國.docx document.save('三國.docx')生成樣板文章
from docx import Document from docx.document import Document as Doc# 讀取 離職證明.docx 文檔 doc = Document('離職證明.docx') # type:Doc# 循環輸出文檔內容 for i, paragraph in enumerate(doc.paragraphs):print(i, paragraph.text)# 將文檔中’曹操‘用’曹丕‘替代 for paragraph in doc.paragraphs:if '曹操' in paragraph.text:for run in paragraph.runs:run.text = run.text.replace('曹操', '曹丕')# 另存為 離職證明(新).docx doc.save('離職證明(新).docx')Word就簡單介紹一下了。
操作PDF文件
在Python中,可以使用PyPDF2的三方庫來讀取PDF文件,安裝的方法就不多說了。
雖然PyPDF2不能從PDF文檔中提取圖像、圖表或其他媒體,但它可以提取文本,并將其返回為Python字符串。
讀取PDF文件
import PyPDF2 from PyPDF2.pdf import PageObject# 讀取PDF文件 reader = PyPDF2.PdfFileReader('XGBOOST.pdf') # 寫模式 writer = PyPDF2.PdfFileWriter()for page_num in range(reader.numPages):current_page = reader.getPage(page_num) # type: PageObject# 從頁面中抽取文字# print(current_page.extractText())# 旋轉頁面current_page.rotateClockwise(90)writer.addPage(current_page)# 添加一個空白頁writer.addBlankPage()# 保存至 XGBOOS-newT.pdf with open('XGBOOS-newT.pdf', 'wb') as file:writer.write(file)加密PDF文件
import PyPDF2# 讀操作 reader = PyPDF2.PdfFileReader('XGBoost.pdf') # 寫操作 writer = PyPDF2.PdfFileWriter() for page_num in range(reader.numPages):writer.addPage(reader.getPage(page_num))# 加密PDF文件,密碼為foobared writer.encrypt('foobared')# 將加密過的文件保存為 XGBoost_encrypted.pdf with open('XGBoost_encrypted.pdf', 'wb') as file:writer.write(file)我們還可以將上面的代碼封裝在一個函數里面
def encrypt_all(path, name, ept):"""給PDF文件加密:param path: 文件路勁:param name: 文件名:param ept: 加密密碼:return: 返回加密后的新文件"""reader = PyPDF2.PdfFileReader(f'{path}/{name}.pdf')writer = PyPDF2.PdfFileWriter()for page_num in range(reader.numPages):writer.addPage(reader.getPage(page_num))# 加密PDF文件writer.encrypt(ept)with open(f'{path}/{name}_encrypted.pdf', 'wb') as file:writer.write(file)創建PDF文件
這里我們需要用到一個三方庫:reportlab
from reportlab.lib.pagesizes import A4 from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfgen import canvas# 注冊字體文件 pdfmetrics.registerFont(TTFont('Font1', 'fonts/Vera.ttf')) pdfmetrics.registerFont(TTFont('Font2', 'fonts/IPix中文像素字體.ttf'))# 設置頁面大小,當前為A4 pdf_canvas = canvas.Canvas('demo.pdf', pagesize = A4) width, height = A4# 繪圖 image = canvas.ImageReader('guido.jpg') pdf_canvas.drawImage(image, 20, height - 375, 250, 375)# 顯示當前頁 pdf_canvas.showPage()# 寫入文字內容1 設置文字格式 pdf_canvas.setFont('Font2', 40) pdf_canvas.setFillColorRGB(1, 0, 0, 1) pdf_canvas.drawString(width // 4 , height // 4, '我呂布天下無敵啊!') # 寫入文字內容2 設置文字格式 pdf_canvas.setFont('Font1', 40) pdf_canvas.setFillColorRGB(0, 1, 0, 0.5) pdf_canvas.rotate(18) pdf_canvas.drawString(200, 280, 'nothing can defeat you')# 保存 pdf_canvas.save()添加水印
import PyPDF2from PyPDF2.pdf import PageObject# 待添加水印文件 reader1 = PyPDF2.PdfFileReader('XGBoost.pdf') # 水印文件 reader2 = PyPDF2.PdfFileReader('watermark.pdf') # 將前面兩個文件合一,存入新的文件中 writer = PyPDF2.PdfFileWriter()# 給每頁添加水印 watermark_page = reader2.getPage(0) for page_num in range(reader1.numPages):current_page = reader1.getPage(page_num) # type: PageObjectcurrent_page.mergePage(watermark_page)writer.addPage(current_page)# 保存 with open('resources/XGBoost-watermarked.pdf', 'wb') as file:writer.write(file)知識補充:獲取文件夾下所有內容
import os# 獲取指定文件夾下的所有內容 path = 'D:\\pycharm_DATA\\code\\day19' files_list = os.listdir(path) # print(files_list)# 循環輸出該路徑下的文件 for file in files_list:fullpath = os.path.abspath(file)print(fullpath)正則表達式
查找符合某些復雜規則的字符串時,比如在編寫處理字符串的程序或網頁時,就需要正則表達式來給我篩選我們想要的內容。簡單來說,就是正則表達式指一種匹配字符串的模式,功能非常強大,但是它的匹配模式也很復雜。這里我推薦大家去閱讀這篇文字,里面所說非常詳細[正則表達式30分鐘入門教程](正則表達式30分鐘入門教程 (deerchao.cn))
基本符號
| . | 匹配任意字符 | b.t | 可以匹配bat / but / b#t / b1t等 |
| \w | 匹配字母/數字/下劃線 | b\wt | 可以匹配bat / b1t / b_t等 但不能匹配b#t |
| \s | 匹配空白字符(包括\r、\n、\t等) | love\syou | 可以匹配love you |
| \d | 匹配數字 | \d\d | 可以匹配01 / 23 / 99等 |
| \b | 匹配單詞的邊界 | \bThe\b | |
| ^ | 匹配字符串的開始 | ^The | 可以匹配The開頭的字符串 |
| $ | 匹配字符串的結束 | .exe$ | 可以匹配.exe結尾的字符串 |
| \W | 匹配非字母/數字/下劃線 | b\Wt | 可以匹配b#t / b@t等 但不能匹配but / b1t / b_t等 |
| \S | 匹配非空白字符 | love\Syou | 可以匹配love#you等 但不能匹配love you |
| \D | 匹配非數字 | \d\D | 可以匹配9a / 3# / 0F等 |
| \B | 匹配非單詞邊界 | \Bio\B | |
| [] | 匹配來自字符集的任意單一字符 | [aeiou] | 可以匹配任一元音字母字符 |
| [^] | 匹配不在字符集中的任意單一字符 | [^aeiou] | 可以匹配任一非元音字母字符 |
| * | 匹配0次或多次 | \w* | |
| + | 匹配1次或多次 | \w+ | |
| ? | 匹配0次或1次 | \w? | |
| {N} | 匹配N次 | \w{3} | |
| {M,} | 匹配至少M次 | \w{3,} | |
| {M,N} | 匹配至少M次至多N次 | \w{3,6} | |
| | | 分支 | foo|bar | 可以匹配foo或者bar |
| (?#) | 注釋 | ||
| (exp) | 匹配exp并捕獲到自動命名的組中 | ||
| (?<name>exp) | 匹配exp并捕獲到名為name的組中 | ||
| (?:exp) | 匹配exp但是不捕獲匹配的文本 | ||
| (?=exp) | 匹配exp前面的位置 | \b\w+(?=ing) | 可以匹配I’m dancing中的danc |
| (?<=exp) | 匹配exp后面的位置 | (?<=\bdanc)\w+\b | 可以匹配I love dancing and reading中的第一個ing |
| (?!exp) | 匹配后面不是exp的位置 | ||
| (?<!exp) | 匹配前面不是exp的位置 | ||
| *? | 重復任意次,但盡可能少重復 | a.*b a.*?b | 將正則表達式應用于aabab,前者會匹配整個字符串aabab,后者會匹配aab和ab兩個字符串 |
| +? | 重復1次或多次,但盡可能少重復 | ||
| ?? | 重復0次或1次,但盡可能少重復 | ||
| {M,N}? | 重復M到N次,但盡可能少重復 | ||
| {M,}? | 重復M次以上,但盡可能少重復 |
re 模塊
python還提供 re 模塊來支持正則表達式個各種操作,下面是 re 模塊中的一些重要函數
| compile(pattern, flags=0) | 編譯正則表達式返回正則表達式對象 |
| match(pattern, string, flags=0) | 用正則表達式匹配字符串 成功返回匹配對象 否則返回None |
| search(pattern, string, flags=0) | 搜索字符串中第一次出現正則表達式的模式 成功返回匹配對象 否則返回None |
| split(pattern, string, maxsplit=0, flags=0) | 用正則表達式指定的模式分隔符拆分字符串 返回列表 |
| sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替換原字符串中與正則表達式匹配的模式 可以用count指定替換的次數 |
| fullmatch(pattern, string, flags=0) | match函數的完全匹配(從字符串開頭到結尾)版本 |
| findall(pattern, string, flags=0) | 查找字符串所有與正則表達式匹配的模式 返回字符串的列表 |
| finditer(pattern, string, flags=0) | 查找字符串所有與正則表達式匹配的模式 返回一個迭代器 |
| purge() | 清除隱式編譯的正則表達式的緩存 |
| re.I / re.IGNORECASE | 忽略大小寫匹配標記 |
| re.M / re.MULTILINE | 多行匹配標記 |
實例
實例1:判斷用戶名、QQ號碼、手機號碼是否有效
import re# 判斷用戶的用戶名是否復合用戶名命名規則 username = input('請輸入用戶名: ')#username_pattern = re.compile(r'^\w{6,20}$') # 通過compile編譯正則表達式創建Pattern對象 #matcher = username_pattern.match(username) matcher = re.match(r'^\w{6,20}$', username) if matcher is None:print('無效用戶名') else:print(matcher)print(matcher.group())""" # 判斷QQ號是否有效 qq = input('請輸入QQ號: ') matcher = re.match(r'[1-9]\d{4,}', qq) if matcher is None:print('無效QQ') else:print(matcher)print(matcher.group()) """""" # 判斷手機號碼是否有效 telephone = input('請輸入手機號碼: ') matcher = re.match(r'1[3-9]\d{9}$', telephone) if matcher is None:print('無效手機號碼') else:print(matcher)print(matcher.group()) """實例2:從字符串中提取跟正則表達式匹配的部分
import re# match - 匹配 - 從頭開始進行匹配 # search - 搜索 - 從任意位置匹配 # findall - 從字符串中找出所有和正則表達式匹配的內容# 從字符串中提取跟正則表達式匹配的部分 content = """報警電話:110,我們班是Python-2105班, 我的QQ號是123456789,我的手機號是98765432104,謝謝!"""# 創建正則表達式對象 pattern = re.compile(r'\d+') # 從任意位置匹配 matcher = pattern.search(content) while matcher:print(matcher.group())# 匹配到的開始位置,結束位置print(matcher.start(), matcher.end())matcher = pattern.search(content, matcher.end())# 從字符串中找出所有和正則表達式匹配的內容 results = pattern.findall(content) for result in results:print(result)results = re.findall(r'\d+', content) for result in results:print(result)實例3:正則表達式捕獲組
import reimport requests# 匹配整個a標簽,但是只捕獲()中的內容 ---> 正則表達式的捕獲組 pattern = re.compile(r'<a\s.*?href="(.+?)".*?title="(.+?)".*?>') resp = requests.get('https://www.sohu.com/') results = pattern.findall(resp.text) for href, title in results:print(title)print(href)實例4:過濾不良內容
import recontent = '馬化騰是一個沙雕煞筆,FUck you!' pattern = re.compile(r'[傻沙煞][逼筆雕鄙]|笨蛋|fuck|shit', flags=re.IGNORECASE) # modified_content = re.sub(r'[傻沙煞][逼筆雕鄙]|笨蛋|fuck|shit', '*', content, flags=re.I) modified_content = pattern.sub('*', content) print(modified_content)實例5:正則表達式拆分字符串
import repoem = '窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。' # sentences_list = re.split(r',|。', poem) # sentences_list = re.split(r'[,。]', poem) pattern = re.compile(r'[,。]') sentences_list = pattern.split(poem) print(sentences_list) sentences_list = [sentence for sentence in sentences_list if sentence] print(sentences_list) for sentence in sentences_list:print(sentence)總結
以上是生活随笔為你收集整理的python办公自动化(入门)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpwind测试实战之phpwind安
- 下一篇: 自己动手定制winpe+各类dos工具箱