day17回顧
1.文件操作
打開文件,文件讀寫,關(guān)閉文件
with open(文件路徑,打開方式,encoding='utf-8') as 文件對象:
文件對象.read() - 讀
文件對象.write(內(nèi)容) - 寫
2.json數(shù)據(jù)
json數(shù)據(jù): 一個json有且只有一個數(shù)據(jù);這個數(shù)據(jù)類型是json支持的數(shù)據(jù)類型
number,string,boolean,array(list),dictionary(dict),null(None)
json數(shù)據(jù)轉(zhuǎn)python數(shù)據(jù):
json.loads(字符串,編碼類型) - 數(shù)據(jù)操作
json.load(字符串) - 文件操作
python數(shù)據(jù)轉(zhuǎn)json數(shù)據(jù):
json.dumps(python數(shù)據(jù)) - 數(shù)據(jù)操作
json.dump(python數(shù)據(jù),文件對象) - 文件操作
regular
1.什么是正則表達(dá)式
正則表達(dá)式是字符串匹配工具,它是為了在某些需求下可以更方便,更快速的處理字符串
2.什么是正則表達(dá)式處理字符串
python通過提供re模塊來支持我賣你正則表達(dá)式
re.fullmatch(正則表達(dá)式,字符串) - 讓正則表達(dá)式和字符串進(jìn)行完全匹配,返回匹配街故宮,如果匹配不成功返回None
3.怎么寫正則表達(dá)式
python中正則表達(dá)式是放在字符串中,并且這個字符串一般會在最前面加r/R
r'正則'
4.正則語法
- 普通字符 - 代表字符本身
re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)
- . - 匹配一個任意字符
一個 . 代表一個字符,匹配的是任意字符
# 匹配一個字符串,長度是4,第一個字符是任意字符,后面三位是'abc'
re_str = r'.abc'
result = re.fullmatch(re_str, '1abc')
print(result)
- \w - 匹配一個ASCII表中字母,數(shù)字或者下劃線,還可以匹配所有的非ASCII表字符
re_str = r'.\w'
result = re.fullmatch(re_str, 'ss')
print(result)
- \s - 匹配一個空白字符
空白字符包括:空格,回車,制表符
# 匹配一個字符串有4個字符,第一個字符是空白,后面三個任意字符
re_str = r'\s...'
result = re.fullmatch(re_str, '\t456')
print(result)
- \d - 匹配一個數(shù)字字符
# 匹配一個字符串長度是5,前面三個字符是成績:后面是兩個數(shù)字
re_str = r'成績:\d\d'
result = re.fullmatch(re_str, '成績:44')
print(result)
- \b - 檢測單詞邊界(檢測\b是否是單詞邊界)
單詞邊界:所有能夠標(biāo)示一個單詞結(jié)束的符號都是單詞邊界例如:空格,回車,標(biāo)點(diǎn)符號等,字符串開頭,字符串結(jié)束
"""
# 匹配一個字符串是否是'howare,'并且要求w的后面(a的前面)是一個單詞邊界
re_str = r'how\b,are'
result = re.fullmatch(re_str, 'how,are')
print(result)
- ^ - 檢測是否是字符開頭
# 匹配兩個數(shù)字字符的字符串,并且建設(shè)這個字符串時候是字符串開頭
re_str = r'^how\b,are'
result = re.fullmatch(re_str, 'how,are')
print(result)
- $ - 檢測是否是字符串的結(jié)尾
- \大寫字母 - 對\小寫字母功能的否定
a.\W - 匹配非數(shù)字,字母,下劃線
b.\S - 匹配非空白字符
c.\D - 匹配非數(shù)字字符
d.\B - 檢測是否是非單詞邊界
re_str = r'\W\S\D\Bb'
result = re.fullmatch(re_str, '~ovb')
print(result)
- [字符集] - 匹配[]中任意的一個字符
a.取出字符集中的一個
[普通字符集] - 匹配[]中任意的一個字符
例如:[abc],[ab\d]
b.用'-'表示范圍
[字符1-字符2] - 匹配編碼值再字符1編碼到字符2編碼之間的任意一個字符(ord(字符1)<ord(字符2))
例如:[1-8] - 數(shù)字字符'0'到'8'中的一個
[一-龥] - 所有中文字符中的一個
[a-zA-Z] - 所有字母
c.[]內(nèi)容中的最前面加 ^ (Shift+6),表示否定(^ 只有放到[]里面才有意義,在[]其他位置表示普通字符'^')
[^abc] - 匹配一個除了abc以外的任意字符
"""
# 匹配一個字符串長度是4后面3位是'123'第一位是'a','s','+'或者任意數(shù)字中的任意一個
re_str = r'[as\d]123'
result = re.fullmatch(re_str, 'a123')
print(result)
- 轉(zhuǎn)義符號 - 將正則中有特殊意義或者特殊功能的符號,表示符號本身(讓特殊意義消失)
有歧義產(chǎn)生是使用''
- 轉(zhuǎn)義符號 - 將正則中有特殊意義或者特殊功能的符號,表示符號本身(讓特殊意義消失)
a.在中括號外面
在特殊意義的符號前加''讓其特殊意義消失
b.在中括號里面
單獨(dú)的有特殊意義的符號,除了 '^' 在最前面,'-'在兩個字符之間,讓其他都不需要轉(zhuǎn)義,特殊意義自動消失
re_str = r'[1-9]\d+\.\d\d'
print(re.fullmatch(re_str, '1910.45'))
regular
1.匹配次數(shù)
- 匹配0次或者多次
r'abc' - 匹配一個字符串'bc'前有0個或者多個a
r'\d' - 匹配一個字符串由0個或者多個任意數(shù)字字符組成
# 練習(xí):寫一個正則表達(dá)式能夠匹配所有的小數(shù)
re_str = r'[1-9]\d*\.\d*\d'
result = re.fullmatch(re_str, '1.0')
print(result)
- 匹配一次或者多次(至少一次)
"""
r'\d+' - 數(shù)字出現(xiàn)一次或者多次
r'[abc]+' - 匹配一個字符串有一個或者多個字符,每一個字符是abc中的一個
"""
- 匹配一次或者多次(至少一次)
- {}
{N} - 匹配N次, {3}匹配3次
{M,N} - 匹配M到N次
{M,} - 匹配至少M(fèi)次
{,N} - 匹配最多N次
re_str = r's\d{3}'
result = re.fullmatch(re_str, 's123')
print(result)
======貪婪和非貪婪======
2. 貪婪和非貪婪
a.以上是貪婪匹配:匹配次數(shù)不確定的時候,盡可能多
b.非貪婪:
- ? - 匹配一次或者0次
- 在匹配次數(shù)不確定的符號后面加?
在匹配次數(shù)不確定的符號后面加?
*?
+?
{M,N}?
{M,}?
{,N}?
3.=====分之(選擇)=====
分之符號 | - 相當(dāng)于邏輯運(yùn)算里面的or
正則1|正則2 - 先用正則1去匹配如果匹配成功就成功,匹配不成功在使用正則2去匹配
(字符串能和正則1,正則2中任意一個匹配成功就成功)
r'\d{6,12}|[A-Za-z]{6,12}'
4.=====分組:()=====
a.將小括號里面的內(nèi)容作為一個整體操作
b.\數(shù)字 -- 重復(fù)第幾個分組匹配結(jié)果(必須要有分組)
"""
# 用戶名是7-13位,最后兩位必須是aa或者bb或者cc
re_str = r'[a-zA-Z\d]{5,11}(aa|bb|cc)'
re模塊
1.完全匹配 - 讓字符串的長度和字符串的每個字符的值和正則表達(dá)式完全匹配
"""
re.fullmatch(正則表達(dá)式, 字符串) - 匹配成功返回匹配對象,返回失敗返回None
當(dāng)需要隊(duì)整個字符串進(jìn)行條件判斷的時候使用:例如,檢查賬號是否合法,密碼是否符合要求等
result = re.fullmatch(r'(\d{3})=([a-z]{3})', '234=asd')
print(result)
- span - 匹配到的內(nèi)容在原字符串的位置
print(result.span()) # 整個正則表達(dá)式匹配結(jié)果的范圍
print(result.span(1)) # 正則表達(dá)式中第一個分組匹配結(jié)果的范圍
print(result.start(2), result.end(2))
- 2)獲取匹配到的值
print(result.group()) # 整個正則表達(dá)式匹配結(jié)果
print(result.group(1)) # 正則表達(dá)式中第一個分組匹配結(jié)果
3)獲取原字符串
print(result.string)
2.匹配字符串開頭
re.match(正則表達(dá)式, 字符串) - 判斷字符串的開頭是否和正則表達(dá)式相匹配.匹配成功返回匹配對象,匹配失敗返回None
只檢測字符串開頭開頭是否滿足要求
result = re.match('\d{3}', '234456')
print(result)
3.search
re.search(正則表達(dá)式, 字符串) - 在字符串中查找哦是否有和正則表達(dá)式匹配的子串,
如果沒有返回None,如果有就返回第一個匹配結(jié)果
method
result = re.search(r'(\d{3})=([a-z]{3})', 'how 234=abced842=abc===')
print(result, result.span(1), result.group(1))
## 4.findall
re.findall(正則表達(dá)式,字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串,以列表的形式返回
注意: 正則表達(dá)式中有分組的時候
沒有分組 - 整個正則表達(dá)式匹配的結(jié)果作為列表元素(列表元素是字符串)
有一個分組 - 這個分組匹配到的結(jié)果作為列表元素(列表元素是字符串)
兩個以上分組 - 這個分組匹配到的結(jié)果作為列表元素(列表元素是元祖,幾個分組,元祖有幾個元素)
```python
result = re.findall(r'(\d+)([a-z])', 'are sda46ada456sd465ds564')
print(result)
5.finditer
re.finditer(正則表達(dá)式,字符串) - 獲取字符串中所有能夠和正則表達(dá)式匹配的子串的匹配結(jié)果.
返回值是一個迭代器,迭代器中的元素是匹配結(jié)果
result = re.finditer(r'abc(\d|[A-Z]{2})', 'abc4-abcHD===')
print(list(result))
for item in result:
print(item.group())
print(item.group(1))
# 練習(xí):計(jì)算一個字符值所有數(shù)字的和
# re 89he ks90.2 ans78oo1.23h!w9end9009ooo
re_str = r're 89he ks90.2 ans78oo1.23h!w9end9009ooo'
result = re.findall(r'(\d+\.?\d*)', re_str)
print(result)
n = 0
for item in result:
n += float(item)
print(n)
** 短路操作 | 寫在前面的會先匹配,匹配成功不會管后面的**
6.split
re.split(正則表達(dá)式,字符串) - 將字符串按照滿足正則表達(dá)式的子串進(jìn)行切割
result = re.split(r'[=/+-]', 'aaa+hhh-jjj/kkk')
print(result)
7.sub
re.sub(正則表達(dá)式,新字符串,字符串,替換次數(shù)) - 將字符串中滿足正則表達(dá)式的子串替換成新字符串
替換次數(shù)不賦值,表示全部替換
result = re.sub(r'\d+', '=', 'das45ad12das46s21')
print(result)