python3 常用模块_python3-常用模块之re
正則表達式
定義:
正則表達式是對字符串操作的一種邏輯公式,用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
是一種獨立的規則,獨立的語言。只和字符串打交道。
能做什么?
例子1:把一個文件中所有的手機號碼都找出來;
# open打開文件
# 讀文件str
# 從一長串的字符串中找到所有的11位數字
# 一個字符一個字符的讀
例子2:爬蟲,從網頁的字符串中獲取你想要的數據
例子3:提取特定日志內容
規則
字符組:
[] 寫在中括號中的內容,都出現在下面的某一個字符的位置上都是符合規則的
[0-9] ?匹配數字
[a-z] ?匹配小寫字母
[A-Z] ?匹配大寫字母
[4-9] ?匹配4到9數字
[a-zA-Z] 匹配大小寫字母
[a-zA-Z0-9] 匹配大小寫字母+數字
[a-zA-Z0-9_] 匹配數字字母下滑線
轉義符+元字符
\w ?匹配數字字母下滑線word關鍵字[a-zA-Z0-9_]
\d ?匹配所有的數字digit ????[0-9]
\s ?匹配所有的空白符 回車/換行符 制表符 空格space ?[\n\t ]
\W \D \S 和\w \d \s取反
\b 表示單詞的邊界
[\s\S] [\d\D] [\w\W] 三組全集 意思是匹配所有字符
和轉義字母相關的 元字符
\w \d \s(\n\t) \b \W \D \S
元字符
^ 匹配一個字符串的開始
$ 匹配一個字符串的結束
. 表示匹配除換行符之外的所有字符
[] ?只要出現在中括號內的內容都可以被匹配
[^] 只要不出現在中括號中的內容都可以被匹配
a|b ?或 ?符合a規則的或者b規則的都可以被匹配
# 如果a規則是b規則的一部分,且a規則比b規則要苛刻/長,就把a規則寫在前面
# 將更復雜的\更長的規則寫在最前面
() 分組 ?表示給幾個字符加上量詞約束的需求的時候,就給這些量詞分在一個組
量詞
{n}表示 這個量詞之前的字符出現n次
{n,} 表示這個量詞之前的字符至少出現n次
{n,m} 表示這個量詞之前的字符出現n-m次
? 表示匹配量詞之前的字符出現0次 或者1次 表示可有可無
+ 表示匹配量詞之前的字符出現1次 或者 多次
* 表示匹配量詞之前的字符出現0次 或者 多次
練習:
匹配整數 ?\d+
匹配小數 \d+\.\d+
匹配小數或者整數 ?\d+\.\d+|\d+ ??\d+(\.\d+)?
匹配身份證號(暫不考慮校驗規則):
[1-9]\d{14}(\d{2}[\dX])?
[1-9]\d{16}[\dX]|[1-9]\d{14}
貪婪匹配
在允許的范圍內取最長的結果
非貪婪模式/惰性匹配:在量詞的后面加上?
.*?x ??匹配任意非換行符字符任意長度 直到遇到x就停止
字符+量詞 ???約束一個字符連續出現的次數
字符+量詞+?約束一個字符連續出現的最少次數
字符+量詞+?+x約束一個字符連續出現量詞范圍內的最少次數,遇到x就立即停止
以上都是正則表達式自身的規則,與python沒有毛關系
Re模塊
findall : 匹配所有 每一項都是列表中的一個元素
search : 只匹配從左到右的第一個,得到的不是直接的結果,而是一個變量,通過這個變量的group方法來獲取結果
如果沒有匹配到,會返回None,使用group會報錯
程序中一般都是這樣使用:
match:從頭開始匹配,相當于search中的正則表達式加上一個^
字符串處理的擴展 : 替換 切割
split
sub ?舊的 新的 替換次數
subn 返回一個元組,第二個元素是替換的次數
compile 模塊 節省時間
直接把正則表達式編譯成字節碼,在多次使用的過程中,不會多次編譯
finditer 節省使用正則表達式解決問題的空間/內存
分組
group()表示總體匹配出的內容,group(num)表示匹配出第num個分組
importre
s = "happy every day"res = re.search('()([\w\W]+)(\w+>)',s)
print(res.group()) ?# 所有結果print(res.group(1)) ?# 數字代表第幾個分組print(res.group(2))
print(res.group(3))
輸出
Findall 優先級
ret = re.findall('www.(baidu|sina).com', 'www.sina.com')
print(ret) ?# ['sina'] ????這是因為findall會優先把匹配結果組里內容返回,如果想要匹配結果,取消權限即可ret = re.findall('www.(?:baidu|sina).com', 'www.sina.com')
print(ret) ?# ['www.sina.com']
flags有很多可選值:
re.I(IGNORECASE)忽略大小寫,括號內是完整的寫法
re.M(MULTILINE)多行模式,改變^和$的行為
re.S(DOTALL)點可以匹配任意字符,包括換行符
re.L(LOCALE)做本地化識別的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當前環境,不推薦使用
re.U(UNICODE) 使用\w \W \s \S \d \D使用取決于unicode定義的字符屬性。在python3中默認使用該flag
re.X(VERBOSE)冗長模式,該模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注釋
總結
以上是生活随笔為你收集整理的python3 常用模块_python3-常用模块之re的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++:计算N的N次方的个位数(火眼
- 下一篇: 节水小妙招