正規表示式(re模組)是一種小型的,高度專業化的程式語言。(在python中)它內嵌在python中,並通過re模組實現。正規表示式模組被編譯成一系列位元組碼,然後由用c編寫的匹配引擎執行。
正則就是處理字串的。
1.普通字元:字串本身的方法。比如字串的 find(), split().
2. 元字元: .^$*+?{}|()\
import re
s = "hellopythonworldpydsonds"
print(re.findall("py..on", s)); # .萬用字元,可以表示任意字元(\n除外)
s = "pythonhelloworldpydsonds"
print(re.findall("^py..on", s)); # ^ 被模糊匹配的字串必須在字串的開頭位置
s = "pythonhelloworlddspydson"
print(re.findall("py..on$", s)); # $ 被模糊匹配的字串必須在字串的末尾位置
s = "pythonheguannnlddspydson"
print(re.findall("guan*", s)); # * 匹配0至無窮次的字元, guan*表示匹配 gua, guan, guann, guannn...(n可以是0個, 0到無窮個,貪婪匹配(盡可能匹配))
s = "pythonheguannnlddspydson"
print(re.findall("guan+", s)); # + 匹配1至無窮次的字元, guan+表示匹配 guan, guann, guannn...(n至少1個, 1到無窮個,貪婪匹配(盡可能匹配))
s = "pythonhegualddspydson"
print(re.findall("guan*", s)); # * 匹配0至無窮次的字元, guan*表示匹配 gua, guan, guann, guannn...(n可以是0個, 0到無窮個,貪婪匹配(盡可能匹配))
s = "pythonhegualddspydson"
print(re.findall("guan+", s)); # + 匹配1至無窮次的字元, guan+表示匹配 guan, guann, guannn...(n至少1個, 1到無窮個,貪婪匹配(盡可能匹配))
s = "pythonhegualddspydson"
print(re.findall("guan?", s)); # ? 匹配0或1個字元, guan?表示只能匹配 gua, guan(只能匹配0個n,或1個n的字元,貪婪匹配(盡可能匹配))
# ==*, ==+, ==?, 用{}可以表示,*,+,?的效果
# 當然{}中可以是任意數字 表示可以匹配0-6個字元, 表示只能匹配6個字元
s = "pythonheguannlddspydson"
print(re.findall("guan", s)); # 表示只能匹配6個字元
s = "pythonheguannlddspydson"
print(re.findall("guan", s)); # 表示可以匹配0-6個字元
s = "pythonheguannnlddspydson"
print(re.findall("guan*?", s)); # 加?,實現惰性匹配(只匹配最少的)
s = "pythonheguannnlddspydson"
print(re.findall("guan+?", s)); # 加?,實現惰性匹配(只匹配最少的)
s = "pythonheguannnlddspydson"
print(re.findall("guan??", s)); # 加?(第乙個?表示元字元,實現模糊匹配,第2個?表示惰性匹配),實現惰性匹配(只匹配最少的)
表示字符集, 在字符集裡有功能的符號: -(範圍) ^(非) \(轉義)
反斜槓後邊跟元字元去除特殊功能,比如\.
反斜槓後邊跟普通字元實現特殊功能,比如\d
\d 可以匹配任何十進位制數,相當於[0-9]
\d 可以匹配任何非數字字元,相當於[^0-9]
\s 可以匹配任何空白字元,相當於[\t\n\r\f\v]
\s 可以匹配任何非空白字元,相當於[^\t\n\r\f\v]
\w 匹配任何字母數字字元,相當於[a-za-z0-9]
\w 匹配任何非字母數字字元,相當於[^a-za-z0-9]
\b 匹配乙個特殊字元邊界,比如空格, &, #等
s = "pythonheguanfnlddspydson"
print(re.findall("guan[a-z]", s)); # - [a-z],表示字母a到z之間的所有字母
s = "pythonheguan7nnlddspydson"
print(re.findall("guan[^a-z]", s)); # ^表示非, [^a-z],表示不是字母a到z之間的其他字元
s = "1-90+((888*4)/2-5)"
print(re.findall("\d+",s))
print(re.findall("\d+",s))
s = "hello world python!"
print(re.findall("\s+",s))
s = "hello world python!"
print(re.findall("\s+",s))
s = "hello wor%ld pyt*hon! 43&52"
print(re.findall("\w+",s))
s = "hello wor%ld pyt*hon! 43&52&43^87"
print(re.findall("\w+",s))
s = "hello6world"
print(re.findall("hello\.world",s)) # "hello\.world"只能匹配"hello.world"
s = "hello i# i$ world list"
print(re.findall("i\\b", s)) # \b在ascii碼中本身就有特殊含義,如果寫成re.findall("i\b", s),那麼最終傳給re模組的就是轉換過的字元而不是\b
s = "hello i\crld list"
print(re.findall("i\\\\c", s))# python直譯器會轉移一次,變成 "i\\c", 然後re模組再轉移一次,變成"i\c"
分組 "()"
s = "defabdefabdef"
print(re.findall("(def)+", s))
s = "liubei22guanyu21zhangfei20zhaoyun"
print(re.search("(?p[a-z]+)\d+", s).group()) # search()只匹配第乙個符合條件的
print(re.search("(?p[a-z]+)(?p\d+)", s).group("name")) # (?p《名稱》)為分組起名稱
print(re.search("(?p[a-z]+)(?p\d+)", s).group("age")) # (?p《名稱》)為分組起名稱
s = "567abcdfd545"
print(re.match("\d+", s).group()) # 同search, 不過只在字串開始處進行匹配
print(re.split("[ |]", s)) # 分割 ['567', 'abcdf', 'd54', '5']
print(re.sub("\d+","a","12345deffun767ction98")) # 替換
print(re.subn("\d","a","12345deffun767ction98")) # 替換
it = re.finditer("\d+","124abd456def789uio") #返回乙個迭代器
print(it.__next__().group())
print(it.__next__().group())
print(re.findall("www\.(baidu|souhu)\.com", "rtewww.baidu.comrete")) # 優先獲取()匹配的內容, ['baidu']
print(re.findall("www\.(?:baidu|souhu)\.com", "rtewww.baidu.comrete")) # ?:去掉()的優先順序
Python學習之旅(三十八)
mysql是web世界中使用最廣泛的資料庫伺服器。sqlite的特點是輕量級 可嵌入,但不能承受高併發訪問,適合桌面和移動應用。而mysql是為伺服器端設計的資料庫,能承受高併發訪問,同時占用的記憶體也遠遠大於sqlite。由於python的db api定義都是通用的,所以,操作mysql的資料庫 ...
演算法(三十八)
1 使用者模型檔案去重。抖音上不同的使用者型別我們有不同的使用者模型檔案。我們有乙個模型配置檔案,裡面有很多的不同使用者型別和他們對應的模型檔案。我們需要找出每個模型檔案對應的是哪些使用者型別。給定一行輸入,格式為 a ba表示這個使用者的使用者型別,b表示這個使用者對應的模型檔案。請你輸出每個模型...
笨辦法學Python(三十八)
現在去找一些 python 閱讀一下。你需要自己找 然後從中學習一些東西。你學到的東西已經足夠讓你看懂一些 了,但你可能還無法理解這些 的功能。這節課我要教給你的是 如何運用你學到的東西理解別人的 首先把你想要理解的 列印到紙上。沒錯,你需要列印出來,因為和螢幕輸出相比,你的眼睛和大腦更習慣於接受紙...