Python提供了 with 語句的寫法,既簡單又安全。
文件操作的時候使用with語句可以自動調(diào)用關閉文件操作,即使出現(xiàn)異常也會自動關閉文件操作。
# 1、以寫的方式打開文件
with open('1.txt', 'w') as f:
# 2、讀取文件內(nèi)容
f.write('hello world')
生成器的創(chuàng)建方式
生成器推導式
與列表推導式類似,只不過生成器推導式使用小括號 。
# 創(chuàng)建生成器
my_generator = (i * 2 for i in range(5))
print(my_generator)
# next獲取生成器下一個值
# value = next(my_generator)
# print(value)
# 遍歷生成器
for value in my_generator:
print(value)
next 函數(shù)獲取生成器中的下一個值
for ?循環(huán)遍歷生成器中的每一個值?
yield生成器
yield 關鍵字生成器的特征:在def函數(shù)中具有yield關鍵字
def generator(n):
for i in range(n):
print('開始生成...')
yield i
print('完成一次...')
g = generator(5)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g)) -----> 正常
print(next(g)) -----> 報錯
Traceback (most recent call last):
File "/Users/cndws/PycharmProjects/pythonProject/demo.py", line 14, in <module>
print(next(g))
StopIteration
def generator(n):
for i in range(n):
print('開始生成...')
yield i
print('完成一次...')
g = generator(5)
for i in g:
print(i)
開始生成...
0
完成一次...
開始生成...
1
完成一次...
開始生成...
2
完成一次...
開始生成...
3
完成一次...
開始生成...
4
完成一次...
注意點:
① 代碼執(zhí)行到 yield 會暫停,然后把結(jié)果返回出去,下次啟動生成器會在暫停的位置繼續(xù)往下執(zhí)行
② 生成器如果把數(shù)據(jù)生成完成,再次獲取生成器中的下一個數(shù)據(jù)會拋出一個StopIteration 異常,表示停止迭代異常
③ while 循環(huán)內(nèi)部沒有處理異常操作,需要手動添加處理異常操作
④ for 循環(huán)內(nèi)部自動處理了停止迭代異常
yield關鍵字和return關鍵字
如果不太好理解yield
,可以先把yield
當作return
,他們都在函數(shù)中使用,并履行著返回某種結(jié)果的職責。
這兩者的區(qū)別是:
有return
的函數(shù)直接返回所有結(jié)果,程序終止不再運行,并銷毀局部變量;
而有yield
的函數(shù)則返回一個可迭代的 generator(生成器)對象,可以使用for循環(huán)或者調(diào)用next()方法遍歷生成器對象來提取結(jié)果。
def example():
x = 1
y = 10
while x < y:
yield x
x += 1
example = example()
print(example)
yield與斐波那契數(shù)列
數(shù)學中有個著名的斐波拉契數(shù)列)
要求:數(shù)列中第一個數(shù)為0,第二個數(shù)為1,其后的每一個數(shù)都可由前兩個數(shù)相加得到:
例子:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
現(xiàn)在我們使用生成器來實現(xiàn)這個斐波那契數(shù)列,每次取值都通過算法來生成下一個數(shù)據(jù),生成器每次調(diào)用只生成一個數(shù)據(jù),可以節(jié)省大量的內(nèi)存。
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b # 使用 yield
# print b
a, b = b, a + b
n = n + 1
for n in fib(5):
print n
什么是正則表達式
正則表達式描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
模式:一種特定的字符串模式,這個模式是通過一些特殊的符號組成的。 某種:也可以理解為是一種模糊匹配。
精準匹配:select * from blog where title='python';
模糊匹配:select * from blog where title like ‘%python%’;
正則表達式并不是Python所特有的,在Java、PHP、Go以及JavaScript等語言中都是支持正則表達式的。
正則表達式的功能
① 數(shù)據(jù)驗證(表單驗證、如手機、郵箱、IP地址)
② 數(shù)據(jù)檢索(數(shù)據(jù)檢索、數(shù)據(jù)抓?。?/p>
③ 數(shù)據(jù)隱藏(1356235 王先生)
④ 數(shù)據(jù)過濾(論壇敏感關鍵詞過濾)
什么是re模塊
在Python中需要通過正則表達式對字符串進行匹配的時候,可以使用一個re模塊
# 第一步:導入re模塊
import re
# 第二步:使用match方法進行匹配操作
result = re.match(pattern正則表達式, string要匹配的字符串, flags=0)
# 第三步:如果數(shù)據(jù)匹配成功,使用group方法來提取數(shù)據(jù)
result.group()
match函數(shù)參數(shù)說明:
參數(shù) | 描述 |
---|---|
pattern | 匹配的正則表達式 |
string | 要匹配的字符串。 |
flags | 標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達式修飾符 - 可選標志 |
匹配成功re.match方法返回一個匹配的對象,否則返回None。
我們可以使用group(num) 或 groups() 匹配對象函數(shù)來獲取匹配數(shù)據(jù)。
正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志:
修飾符 | 描述 |
---|---|
re.I | 使匹配對大小寫不敏感 |
re.L | 做本地化識別(locale-aware)匹配,這個功能是為了支持多語言版本的字符集使用環(huán)境的,比如在轉(zhuǎn)義符\w,在英文環(huán)境下,它代表[a-zA-Z0-9_],即所以英文字符和數(shù)字。如果在一個法語環(huán)境下使用,缺省設置下,不能匹配"é" 或 "?"。加上這L選項和就可以匹配了。不過這個對于中文環(huán)境似乎沒有什么用,它仍然不能匹配中文字符。 |
re.M | 多行匹配,影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內(nèi)的所有字符 |
re.U | 根據(jù)Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B. |
re.X | VERBOSE,冗余模式, 此模式忽略正則表達式中的空白和#號的注釋,例如寫一個匹配郵箱的正則表達式。該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。 |
re模塊的相關方法
re.match(pattern, string, flags=0)
-
從字符串的起始位置匹配,如果匹配成功則返回匹配內(nèi)容, 否則返回None
☆ re.findall(pattern, string, flags=0)
-
掃描整個串,返回所有與pattern匹配的列表
-
注意: 如果pattern中有分組則返回與分組匹配的列表
-
舉例:
re.findall("\d","chuan1zhi2") >> ["1","2"]
☆ re.finditer(pattern, string, flags)
-
功能與上面findall一樣,不過返回的時迭代器
參數(shù)說明:
-
pattern : 模式字符串。
-
repl : 替換的字符串,也可為一個函數(shù)。
-
string : 要被查找替換的原始字符串。
-
count : 模式匹配后替換的最大次數(shù),默認 0 表示替換所有的匹配。
-
flags: 匹配方式:
-
re.I 使匹配對大小寫不敏感,I代表Ignore忽略大小寫
-
re.S 使 . 匹配包括換行在內(nèi)的所有字符
-
re.M 多行模式,會影響^,$
-
案例1:查找一個字符串中是否具有數(shù)字“8” ?
import re
result = re.findall('8', '13566128753')
# print(result)
if result:
print(result)
else:
print('未匹配到任何數(shù)據(jù)')
?案例2:查找一個字符串中是否具有數(shù)字
import re
result = re.findall('\d', 'a1b2c3d4f5')
# print(result)
if result:
print(result)
else:
print('未匹配到任何數(shù)據(jù)')
案例3:查找一個字符串中是否具有非數(shù)字
import re
result = re.findall('\D', 'a1b2c3d4f5')
# print(result)
if result:
print(result)
else:
print('未匹配到任何數(shù)據(jù)')
正則表達式編寫:查什么、查多少、從哪查
1、查什么
代碼 | 功能 |
---|---|
.(英文點號) | 匹配任意1個字符(除了\n) |
[ ] | 匹配[ ]中列舉的某個字符,專業(yè)名詞 => 字符簇 |
[^指定字符] | 匹配除了指定字符以外的其他某個字符,^專業(yè)名詞 => 托字節(jié) |
\d | 匹配數(shù)字,即0-9 |
\D | 匹配非數(shù)字,即不是數(shù)字 |
\s | 匹配空白,即 空格,tab鍵 |
\S | 匹配非空白 |
\w | 匹配非特殊字符,即a-z、A-Z、0-9、_ |
\W | 匹配特殊字符,即非字母、非數(shù)字、非下劃線 |
字符簇常見寫法:
① [abcdefg] 代表匹配abcdefg字符中的任意某個字符(1個)
② [aeiou] 代表匹配a、e、i、o、u五個字符中的任意某個字符
③ [a-z] 代表匹配a-z之間26個字符中的任意某個
④ [A-Z] 代表匹配A-Z之間26個字符中的任意某個
⑤ [0-9] 代表匹配0-9之間10個字符中的任意某個
⑥ [0-9a-zA-Z] 代表匹配0-9之間、a-z之間、A-Z之間的任意某個字符
字符簇 + 托字節(jié)結(jié)合代表取反的含義:
① [^aeiou] 代表匹配除了a、e、i、o、u以外的任意某個字符
② [^a-z] 代表匹配除了a-z以外的任意某個字符
\d 等價于 [0-9], 代表匹配0-9之間的任意數(shù)字
\D 等價于 [^0-9],代表匹配非數(shù)字字符,只能匹配1個
2、查多少
代碼 | 功能 |
---|---|
* | 匹配前一個字符出現(xiàn)0次或者無限次,即可有可無(0到多) |
+ | 匹配前一個字符出現(xiàn)1次或者無限次,即至少有1次(1到多) |
? | 匹配前一個字符出現(xiàn)1次或者0次,即要么有1次,要么沒有(0或1) |
{m} | 匹配前一個字符出現(xiàn)m次,匹配手機號碼\d{11} |
{m,} | 匹配前一個字符至少出現(xiàn)m次,\w{3,},代表前面這個字符最少要出現(xiàn)3次,最多可以是無限次 |
{m,n} | 匹配前一個字符出現(xiàn)從m到n次,\w{6,10},代表前面這個字符出現(xiàn)6到10次 |
基本語法:
正則匹配字符.或\w或\S + 跟查多少
如\w{6, 10}
如.*,匹配前面的字符出現(xiàn)0次或多次
3、從哪查
代碼 | 功能 |
---|---|
^ | 匹配以某個字符串開頭 |
$ | 匹配以某個字符串結(jié)尾 |
正則工具箱 :文章來源:http://www.zghlxwxcb.cn/news/detail-764093.html
正則表達式代碼生成工具 等文章來源地址http://www.zghlxwxcb.cn/news/detail-764093.html
到了這里,關于Python高級語法與正則表達式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!