正則表達式html
1、正則介紹python
2、匹配一個字符正則表達式
3、量詞算法
4、分組和位置數據庫
5、函數設計模式
回到頂部併發
1.做用框架
正則(Regular Expression) : 表達對數據的匹配 過濾 提取邏輯的表達式機器學習
從頭開始匹配 若是某一個匹配失敗 總體就失敗了
若是匹配成功 返回匹配結果對象
若是匹配失敗 返回None
獲取匹配結果
匹配結果對象.group()
"強烈"建議:
1. . 字符
點字符 : 表明匹配任意一個字符 默認除了 \n
re.S模式可讓 . 匹配\n : re.match(r"\d{3,5}.+", "123\nqq", "re.S")
\. 與字符 點 相同 多用於在匹配郵箱時候使用
2. [] 匹配字符
[] : 匹配其中任意一個字符
[0-9] : 是指 0 - 9 的範圍
[^0-9] : 取反 禁止匹配
3. \d \w \s字符
\d : 數字字符
\w : 單詞字符[0-9a-zA-Z_]
在py3 中 Unicdode \w 能夠匹配漢字
在py2 中 Ascll \w不能匹配漢字
\s : 空白字符
1.{}字符 : 匹配{m,n}, 至少m次 之多n次, {m}m次
2.*字符 : 任意次
3.+字符 : 至少一次
4.?字符 : 0次或者1次
1.分組
目的 : 提取出想要的部分
2.匿名分組
建立: "(正則)"
用戶建立的分組從1開始 0號分組已經存儲總體結果
獲取分組結果:
匹配結果對象.group(分組編號=0)
.group(編號,編號)
分組引用:
但願在正則的後續位置使用前面的分組匹配的數據
\分組的編號
re.match(r"嫦娥(\d+)號", "嫦娥998號").group() re.match(r"嫦娥(\d+)號", "嫦娥998號").group(0) re.match(r"嫦娥(\d+)號", "嫦娥998號").group(1) re.match(r"嫦娥(\d+)號 998", "嫦娥998號 998").group(1) re.match(r"嫦娥(\d+)號 999", "嫦娥999號 999").group(1) # 上面寫 不靈活 每次分組數據不同所有須要改寫 # 若是須要使用前面分組的數據繼續匹配 - 分組引用 re.match(r"嫦娥(\d+)號 \1", "嫦娥999號 999").group(1) re.match(r"嫦娥(\d+)號 \1", "嫦娥1999號 1999").group(1) re.match(r"(\d{3,4})-\d{6,8}", "010-000001").group() re.match(r"(\d{3,4})-\d{6,8}", "010-000001").group(1) re.match(r"(\d{3,4})-(\d{6,8})", "010-000001").group(2) re.match(r"(\d{3,4})-(\d{6,8}) \1-\2", "010-000001 010-000001").group(2)
3.命名分組
給每一個分組起一個名稱 編號發送變化不會影響正則的使用
建立
"(?P<分組名稱>正則)"
獲取結果
.group(分組名稱)
* 也能夠經過下標訪問
建立分組並分組引用
"(?P<分組名稱>正則) (?P=分組名稱)"
re.match(r"(?P<area>\d{3,4})-(?P<no>\d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(1,2) re.match(r"(?P<area>\d{3,4})-(?P<no>\d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group('no') re.match(r"((?P<area>\d{3,4})-(?P<no>\d{6,8})) (?P=area)-(?P=no)", "010-000001 010-000001").group('no')
4. | 符號
r"表達式(部分1|部分2|部分3)" 匹配分組中 |左右任意一個表達式
re.match(r"^\w{4,16}@163\.com$", "123456@163.com").group() re.match(r"^\w{4,16}@163\.com$|^\w{4,16}@263\.com$|^\w{4,16}@qq\.com$", "123456@qq.com").group() re.match(r"^\w{4,16}@(163|263|qq)\.com$", "123456@263.com").group()
match(正則,數據) - -> 匹配對象 從頭匹配
search(正則,數據) - -> 匹配對象 從頭開始搜索 日後面嘗試
findall(正則,數據) --> 返回列表 查找全部
sub(正則,替換數據,數據,次數) -- > 替換後的數據
html =""" <div> <p>崗位職責:</p> <p>完成推薦算法、數據統計、接口、後臺等服務器端相關工做</p> <p><br></p> <p>必備要求:</p> <p>良好的自我驅動力和職業素養,工做積極主動、結果導向</p> <p> <br></p> <p>技術要求:</p> <p>一、一年以上 Python 開發經驗,掌握面向對象分析和設計,瞭解設計模式</p> <p>二、掌握HTTP協議,熟悉MVC、MVVM等概念以及相關WEB開發框架</p> <p>三、掌握關係數據庫開發設計,掌握 SQL,熟練使用 MySQL/PostgreSQL 中的一種<br></p> <p>四、掌握NoSQL、MQ,熟練使用對應技術解決方案</p> <p>五、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p> <p> <br></p> <p>加分項:</p> <p>大數據,數理統計,機器學習,sklearn,高性能,大併發。</p> </div>""" res = re.sub(r"</?\w+>|\s| ", "", html) print(res)
def add(match_obj): # 獲取匹配結果的數據 value = match_obj.group() result = int(value) + 1 # 返回值必須是字符串類型 return str(result) res = re.sub(r"\d{2,3}", add, "python=100 cp=96") print(res)
split(正則,數據) --> 切割後的列表
data = "貂蟬,楊玉環:西施,王昭君 鳳姐" res = re.split(r",|:|\s", data) print(res)
1.貪婪和懶惰
懶惰 儘量少匹配
貪婪模式變爲懶惰模式 量詞後加?便可
# html 去直播找源代碼 res = re.search(r"https://.+\.jpg", html).group() # 一個結果很長 print(res) # res = re.search(r"https://.+?\.jpg", html).group() # 一個結果很短 # # 理解貪婪模式和非貪婪模式以後 再看下面的代碼 # print(res) # res = re.findall(r"https://.+?\.jpg|https://.+?\.png", html) # print(res) # res = re.findall(r"https://.+?\.(?:jpg|png)", html) # print(res) # 取消分組 由於findall的結果默認是用戶建立的分組數據 須要取消用戶建立的分組從而顯示總體結果(?:正則)
# 驗證貪婪和懶惰 # res = re.match(r"^(\d+?)(\d+)$", "13546456789").group(1,2) # res = re.match(r"^(\d+?)(\d?)$", "13546456789").group(1,2) # res = re.match(r"^(\d+)(\d?)$", "13546456789").group(1,2) # print(res)
2. r
若是字符串中有雙斜槓 正則須要四反斜槓來進行匹配
爲解決反斜槓困擾問題, 使用r標識數據
r"\1" ===> "\\1" 自動對數據中的\進行轉義 ——> 雙反斜槓 \