一、數(shù)據(jù)庫(kù)編程
- 可以使用python腳本對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,比如獲取數(shù)據(jù)庫(kù)數(shù)據(jù)保存到文件中,這個(gè)功能可以通過(guò)數(shù)據(jù)庫(kù)相關(guān)模塊進(jìn)行實(shí)現(xiàn)。
- 在python2.x版本中使用的是MySQLdb模塊,python3.x版本中使用的是pymysql模塊,兩者用法幾乎相同。
- pymysql是第三方模塊,需要單獨(dú)安裝,首選通過(guò)pip安裝PyMySQL。
- 對(duì)不同類型的數(shù)據(jù)庫(kù)操作,需要安裝導(dǎo)入的模塊也不同。
1.1 connect()函數(shù)
- connect()函數(shù):用來(lái)建立和數(shù)據(jù)庫(kù)的連接。
connect()函數(shù)常用參數(shù) | 描述 |
---|---|
host | 數(shù)據(jù)庫(kù)主機(jī)地址 |
user | 數(shù)據(jù)庫(kù)賬戶 |
passwd | 賬戶密碼 |
db | 使用的數(shù)據(jù)庫(kù) |
port | 數(shù)據(jù)庫(kù)主機(jī)端口,默認(rèn)3306 |
connect_timeout | 連接超時(shí)時(shí)間,默認(rèn)10,單位秒 |
charset | 使用的字符集 |
cursorclass | 自定義游標(biāo)使用的類。上面示例用的是字典類,以字典形式返回結(jié)果,默認(rèn)是元組形式。 |
1.安裝pymysql模塊。
pip3 install pymysql
2.準(zhǔn)備好數(shù)據(jù)庫(kù)信息。
##安裝數(shù)據(jù)庫(kù)實(shí)例。
docker run -d --name qingjun -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30
##創(chuàng)建數(shù)據(jù)庫(kù)和表,用來(lái)測(cè)試。
create database test;
use test;
create table user(id int primary key not null auto_increment,username varchar(50) not null,password varchar(50) not null);
3.連接數(shù)據(jù)庫(kù),開(kāi)始操作數(shù)據(jù)庫(kù)。
import pymysql
##數(shù)據(jù)庫(kù)信息。
conn = pymysql.connect(host='192.168.161.132',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor() ##建立數(shù)據(jù)庫(kù)連接。
# 創(chuàng)建一條記錄.
sql = "insert into user(username, password) values('qingjun', '123456')"
cursor.execute(sql) ##執(zhí)行sql語(yǔ)句。
conn.commit() ##寫(xiě)入到數(shù)據(jù)庫(kù)。
4.查看數(shù)據(jù)庫(kù)數(shù)據(jù)。
1.2 命令參數(shù)
連接對(duì)象常用方法 | 描述 |
---|---|
commit() | 提交事務(wù)。對(duì)支持事務(wù)的數(shù)據(jù)庫(kù)和表,如果提交修改操作,不適用這個(gè)方法,則不會(huì)寫(xiě)到數(shù)據(jù)庫(kù)中 |
rollback() | 事務(wù)回滾。對(duì)支持事務(wù)的數(shù)據(jù)庫(kù)和表,如果執(zhí)行此方法,則回滾當(dāng)前事務(wù)。在沒(méi)有commit()前提下。 |
cursor([cursorclass]) | 創(chuàng)建一個(gè)游標(biāo)對(duì)象。所有的sql語(yǔ)句的執(zhí)行都要在游標(biāo)對(duì)象下進(jìn)行。MySQL本身不支持游標(biāo),MySQLdb模塊對(duì)其游標(biāo)進(jìn)行了仿真。 |
游標(biāo)對(duì)象常用方法 | 描述 |
---|---|
close() | 關(guān)閉游標(biāo) |
execute(sql) | 執(zhí)行sql語(yǔ)句 |
executemany(sql) | 執(zhí)行多條sql語(yǔ)句 |
fetchone() | 從運(yùn)行結(jié)果中取第一條記錄,返回字典 |
fetchmany(n) | 從運(yùn)行結(jié)果中取n條記錄,返回列表 |
fetchall() | 從運(yùn)行結(jié)果中取所有記錄,返回列表 |
1.3 常用語(yǔ)句
1.插入數(shù)據(jù)。
import pymysql
conn = pymysql.connect(host='192.168.161.132',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()
##插入一條數(shù)據(jù)。
sql = "insert into user(username, password) values('wuhan', '88')"
cursor.execute(sql)
conn.commit()
conn.close() ##關(guān)閉游標(biāo)
##插入多條數(shù)據(jù)。
sql = "insert into user(username, password) values(%s,%s)"
args = [('beijing',222),('shenzheng',9990)]
cursor.executemany(sql,args)
conn.commit()
conn.close() ##關(guān)閉游標(biāo)
2.查詢數(shù)據(jù)。
import pymysql
conn = pymysql.connect(host='192.168.161.132',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()
##查詢數(shù)據(jù)。
sql = "select * from user"
cursor.execute(sql)
print(cursor.fetchone()) ##獲取第一條記錄。
print(cursor.fetchmany(1)) ##從運(yùn)行結(jié)果中,獲取1條記錄。
print(cursor.fetchall()) ##獲取所有記錄。
conn.close() ##關(guān)閉游標(biāo)
3.修改數(shù)據(jù)。
import pymysql
conn = pymysql.connect(host='192.168.161.132',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()
##修改數(shù)據(jù)。
sql = "update user set password='100' where username='wuhan'"
cursor.execute(sql)
conn.commit()
conn.close() ##關(guān)閉游標(biāo)
4.刪除數(shù)據(jù)。
import pymysql
conn = pymysql.connect(host='192.168.161.132',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()
##刪除數(shù)據(jù)。
sql = "delete from user where username='qingjun'"
cursor.execute(sql)
conn.commit()
conn.close() ##關(guān)閉游標(biāo)
5.遍歷查詢結(jié)果。
try:
with conn.cursor() as cursor:
sql = "select id,username,password from user"
cursor.execute(sql)
result = cursor.fetchall()
for dict in result:
print(f"ID: {dict['id']}, 用戶名: {dict['username']}, 密碼: {dict['password']}")
finally: ##不管try是否執(zhí)行成功,finally都執(zhí)行。
conn.close()
二、正則表達(dá)式
- 正則表達(dá)式是對(duì)字符串操作的一種邏輯方式,就是用實(shí)現(xiàn)定義好的一些特定字符及這些特定字符的組合,組成一個(gè)規(guī)則字符串,這個(gè)規(guī)則字符串就是表達(dá)對(duì)字符串的邏輯,給定一個(gè)正則表達(dá)式和另一個(gè)字符串,通過(guò)正則表達(dá)式從字符串我們想要的部分。
- Python正則表達(dá)式主要由re標(biāo)準(zhǔn)庫(kù)提供,擁有了基本所有的表達(dá)式。
2.1 匹配方式
方法 | 描述 |
---|---|
re.compile(pattern, flags=0) | 把正則表達(dá)式編譯成一個(gè)對(duì)象。 pattern 指的是正則表達(dá)式,flags是標(biāo)志位的修飾符,用于控制表達(dá)式匹配模式 |
re.match(pattern, string, flags=0) | 匹配字符串開(kāi)始,如果不匹配返回None |
re.search(pattern, string, flags=0) | 掃描字符串尋找匹配,如果符合返回一個(gè)匹配對(duì)象并終止匹配,否則返回None |
re.split(pattern, string, maxsplit=0, flags=0) | 以匹配模式作為分隔符,切分字符串為列表 |
re.findall(pattern, string, flags=0) | 以列表形式返回所有匹配的字符串 |
re.finditer(pattern, string, flags=0) | 以迭代器形式返回所有匹配的字符串 |
re.sub(pattern, repl, string, count=0, flags=0) | 字符串替換,repl替換匹配的字符串,repl可以是一個(gè)函數(shù) |
1.老方法匹配字符串。優(yōu)點(diǎn)是,方便再次使用。
a = 'this is jdasi1!#@sjkdjalk'
import re
pattern = re.compile("this") ##預(yù)定義正則表達(dá)式。
baimu = pattern.match(a) ##使用預(yù)定義的正則表達(dá)式匹配字符串,
print(baimu)
print(baimu.group()) ##過(guò)濾出匹配的字符串。
2.常用方式匹配,優(yōu)點(diǎn)是,更直觀。從第一個(gè)字符串開(kāi)始匹配。
a = 'this is jdasi1!#@sjkdjalk'
import re
qingjun = re.match("this",a)
print(qingjun.group())
3.掃描匹配。
import re
s = "我今年23335歲"
result2 = re.search("\d+", s)
print(result2.group())
4.以匹配模式作為分隔符,切分字符串為列表。
import re
s = "我今年23335歲"
result2 = re.split("\d+", s) ##\d+作為分隔符。
print(result2)
5.以列表形式返回所有匹配的字符串。
import re
s = "我今年23335歲,張三今年22歲"
result2 = re.findall("\d+", s) ##匹配字符串中所有的數(shù)字,并返回一個(gè)列表,
print(result2)
6.替換匹配。
import re
s = "我今年23335歲,張三今年22歲"
result2 = re.sub("\d+","50",s) ##將字符串中的所有數(shù)字替換成50
print(result2)
2.2 字符匹配
字符匹配 | 描述 |
---|---|
. | 任意單個(gè)字符(除了\n) |
[ ] | 匹配中括號(hào)中的任意1個(gè)字符。并且特殊字符寫(xiě)在[ ]會(huì)被當(dāng)成普通字符來(lái)匹配 |
[ .-.] | 匹配中括號(hào)中范圍內(nèi)的任意1個(gè)字符,例如[a-z],[0-9] |
[^] | 匹配 [^字符] 之外的任意一個(gè)字符 |
\d | 匹配數(shù)字,等效[0-9] |
\D | 匹配非數(shù)字字符,等效[^0-9] |
\s | 匹配單個(gè)空白字符(空格、Tab鍵),等效[\t\n\r\f\v] |
\S | 匹配空白字符之外的所有字符,等效[^\t\n\r\f\v] |
\w | 匹配字母、數(shù)字、下劃線,等效[a-zA-Z0-9_] |
\W | 與\w相反,等效[^a-zA-Z0-9_] |
1.匹配單個(gè)字符,使用"."
a = 'this is jdasi1!#@sjkdjalk'
import re
qingjun1 = re.match(".",a)
qingjun2 = re.match("..",a)
qingjun3 = re.match("...",a)
print(qingjun1.group())
print(qingjun2.group())
print(qingjun3.group())
2.匹配[ ]中任意一個(gè)字符。
a = 'this is jdasi1!#@sjkdjalk'
import re
qingjun1 = re.match("[tZZx]",a)
qingjun2 = re.match("[tZZx][shj]",a)
qingjun3 = re.match("[tZZx][shj][iOk]",a) ##第1個(gè)[]匹配字符串中第1個(gè)字符,第2個(gè)[]匹配字符串中第1個(gè)字符,以此類推。
qingjun4 = re.match("[^i]",a) ##取反匹配,匹配除i之外的任意字符,所以能匹配到t。
qingjun5 = re.match("[a-z][a-k]",a) ##匹配a~z中任意字符。
print(qingjun1.group())
print(qingjun2.group())
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
3.匹配數(shù)字,”\d“。
a = '99isl3'
import re
qingjun1 = re.match("[0-9]",a)
qingjun2 = re.match("[0-9][0-9]",a)
qingjun3 = re.match("[0-9][0-9][a-z]",a)
qingjun4 = re.match("\d\d",a) ## \d等同于[0-9]
qingjun5 = re.match("\d\d[a-z]",a)
qingjun6 = re.match("\d\d\D",a) ## \D等同于[^0-9]
print(qingjun1.group())
print(qingjun2.group())
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
print(qingjun6.group())
4.匹配單個(gè)空白字符,”\s“。
a = '99 isl3'
import re
qingjun3 = re.match("\d\d\s\D",a)
qingjun4 = re.match("[0-9][0-9]\s[a-z]",a)
print(qingjun3.group())
print(qingjun4.group())
5.匹配空白字符之外的所有字符,”\S“。
a = '99 isl3'
import re
qingjun3 = re.match("\d\d\s\D",a)
qingjun4 = re.match("[0-9][0-9]\s[a-z]",a)
qingjun5 = re.match("\S\S\s[a-z]",a)
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
6.匹配字母、數(shù)字、下劃線,“\w”
a = '99 _\sl3'
import re
qingjun3 = re.match("\d\d\s\w\D",a) ## \w等效[a-zA-Z0-9_]
print(qingjun3.group())
7.自動(dòng)轉(zhuǎn)義,”r““表示原始字符串,有了它,字符串里的特殊意義符號(hào)就會(huì)自動(dòng)加轉(zhuǎn)義符。
a = '99\\aks'
import re
qingjun3 = re.match("\d\d\\\\[a-z][a-z][a-z]",a) ##不加r,則需要額外對(duì)\轉(zhuǎn)義。
qingjun4 = re.match(r"\d\d\\[a-z][a-z][a-z]",a) ##加r,自動(dòng)對(duì)\轉(zhuǎn)義。
print(qingjun3)
print(qingjun4)
2.3 數(shù)量匹配
字符 | 描述 |
---|---|
* | 匹配前面的子表達(dá)式0次或多次(無(wú)限次) |
+ | 匹配前面的子表達(dá)式1次或多次 |
? | 匹配前面的子表達(dá)式0次或1次 |
{n} | 匹配花括號(hào)前面字符n個(gè)字符 |
{n,} | 匹配花括號(hào)前面字符至少n個(gè)字符 |
{n,m} | 匹配花括號(hào)前面字符至少n個(gè)字符,最多m個(gè)字符 |
1.匹配0次或無(wú)限次,“ * ”的用法。
a = 'dddjsksls'
import re
qingjun3 = re.match(".*",a) ##匹配所有字符。
qingjun4 = re.match(r"d*",a) ##匹配d出現(xiàn)的0次或多次。
qingjun5 = re.match(r"dddj*",a) ##匹配j出現(xiàn)的0次或多次。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
2.匹配1次或多次,“ + ”的用法。
a = 'dddjsksls'
import re
qingjun3 = re.match(".*",a) ##匹配所有字符。
qingjun4 = re.match(r"d+",a) ##匹配d出現(xiàn)的1次或多次。
qingjun5 = re.match(r"\D+",a) ##前面字符出現(xiàn)1次或多次。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
3.匹配1次或多次,“ ? ”的用法。
a = 'dddjsksls'
import re
qingjun3 = re.match(".*",a) ##匹配所有字符。
qingjun4 = re.match(r"dd?",a) ##匹配d出現(xiàn)的0次或1次。
qingjun5 = re.match(r"\D?",a) ##前面字符出現(xiàn)0次或1次。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
4.限制匹配,只匹配{ n }前的n個(gè)字符,超過(guò)n個(gè)字符的之外所有字符都不能被匹配到。
a = '136182290672292'
import re
qingjun3 = re.match(".*",a) ##匹配所有字符。
qingjun4 = re.match(r"\d+",a) ##匹配所有字符。
qingjun5 = re.match(r"\d{11}",a) ##限制匹配前11位字符。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
5.限制匹配,至少匹配{ n, }中n個(gè)字符。
a = '136182290672292'
import re
qingjun3 = re.match(".*",a) ##匹配所有字符。
qingjun4 = re.match(r"\d+",a) ##匹配所有字符。
qingjun5 = re.match(r"\d{11}",a) ##限制匹配前11位字符。
qingjun6 = re.match(r"\d{11,}",a) ##至少匹配前11位字符。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
print(qingjun6.group())
6.限制匹配,至少匹配{ n,m }中前n位字符,且至多匹配前m位字符。
a = '136182290672292'
import re
qingjun3 = re.match(".*",a) ##匹配所有字符。
qingjun4 = re.match(r"\d+",a) ##匹配所有字符。
qingjun5 = re.match(r"\d{11}",a) ##限制匹配前11位字符。
qingjun6 = re.match(r"\d{11,}",a) ##至少匹配前11位字符。
qingjun7 = re.match(r"\d{11,13}",a) ##至少匹配前11位,至多匹配13位字符。
print(qingjun3.group())
print(qingjun4.group())
print(qingjun5.group())
print(qingjun6.group())
print(qingjun7.group())
2.4 邊界匹配
字符 | 描述 |
---|---|
^ | 匹配以什么開(kāi)頭 |
$ | 匹配以什么結(jié)尾 |
\b | 匹配單詞邊界 |
\B | 匹配非單詞邊界 |
1.例一,判斷用戶輸入的郵箱格式。
import re
email = input("請(qǐng)輸入你的郵箱:")
qingjun = re.match('^\w+@[a-z]+\.[a-z]+$',email) #2571788322@qq.com
if qingjun:
print("格式正確!")
else:
print("格式錯(cuò)誤!")
2.5 分組匹配
字符 | 描述 |
---|---|
| | 匹配豎杠兩邊的任意一個(gè)正則表達(dá)式 |
(re) | 匹配小括號(hào)中正則表達(dá)式。使用\n反向引用,n是數(shù)字,從1開(kāi)始編號(hào),表示引用第n個(gè)分組匹配的內(nèi)容。 |
(?Pre) | 分組別名,name是表示分組名稱 |
(?P=name) | 引用分組別名 |
1.分組選擇匹配,能匹配中()中的任意一個(gè)。
##判斷用戶輸入的郵箱格式。
import re
email = input("請(qǐng)輸入你的郵箱:")
qingjun = re.match('^(\w|-)+@[a-z]+\.(com|163)+$',email) #-2571788322@qq.com、-2571788322@qq.163
if qingjun:
print("格式正確!")
else:
print("格式錯(cuò)誤!")
2.引用分組。
import re
s = '<f1>18213921321<f1>'
qingjun1 = re.match('<(\w+).*<(\w+)>',s) ##qingjun1效果等于qingjun2。
qingjun2 = re.match('<(\w+).*<(\\1)>',s) ##正常語(yǔ)法是\n,n為數(shù)字,這里需要轉(zhuǎn)義一下,表示引用第一個(gè)分組結(jié)果。
print(qingjun2.group()) ##匹配所有分組。
print(qingjun2.group(1)) ##匹配第1個(gè)分組。
print(qingjun2.group(2)) ##匹配第2個(gè)分組。
3.分組別名引用。
import re
s = '<f1>18213921321<f1>'
qingjun = re.match('<(?P<baimu1>\w+).*<(?P<baimu2>\w+)>',s) ##常對(duì)分組定義別名,因?yàn)橐脭?shù)字容易出錯(cuò)。
print(qingjun.group()) ##匹配所有分組
print(qingjun.group("baimu1")) ##引用baimu1分組內(nèi)容。
print(qingjun.group("baimu2")) ##引用baimu2分組內(nèi)容。
2.6 貪婪模式&非貪婪模式
- 貪婪模式:盡可能最多匹配。
- 非貪婪模式:盡可能最少匹配,一般在量詞(*、+)后面加個(gè)?問(wèn)號(hào)就是非貪婪模式。
1.例一,貪婪模式和非貪婪模式的區(qū)別。
import re
s = "hello 666666"
result = re.match("hello 6+", s) # 貪婪匹配
print(result)
result = re.match("hello 6+?", s) # 非貪婪匹配
print(result)
2.例2,貪婪模式。
import re
s = "我今年23335歲"
result = re.match("\w+(\d+)\w+", s) # 貪婪匹配
print(result.group(1))
3.例三,非貪婪模式。
import re
s = "我今年23335歲"
result = re.match("\w+?(\d+)\w+", s) # 貪婪匹配
print(result.group(1))
2.7 標(biāo)志位
字符 | 描述 |
---|---|
re.I/re.IGNORECASE | 忽略大小寫(xiě) |
re.S/re.DOTAIL | 匹配所有字符,包括換行符\n,如果沒(méi)這個(gè)標(biāo)志將匹配除了換行符 |
1.忽略大小寫(xiě)匹配。
import re
s = "hello world"
result1 = re.match("Hello",s)
print(result1)
result2 = re.match("Hello",s,re.I) ##寫(xiě)法一。
print(result2)
result3 = re.match("Hello",s,re.IGNORECASE) ##寫(xiě)法二。
print(result3)
2.匹配所有字符,包括換行符。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-660903.html
import re
s = """hello
world
"""
result2 = re.match("h.*",s,re.S)
print(result2)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-660903.html
到了這里,關(guān)于python基礎(chǔ)5——正則、數(shù)據(jù)庫(kù)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!