re模塊
1、什么是正則運算式?什么是re模塊?
(1)正則運算式:
正則運算式是一門獨立的技術,人和語言都可以使用正則運算式,
正則運算式是由一堆特殊的字符組合而來的
① 元字符:
^:代表開頭
$:代表結束
|:或者的意思
():可以獲取一個值,判斷是否是13或14等
{9}:需要獲取9個值
[]:分組限制取值范圍,[0-9]:限制只能獲取0-9的某一個字符
參考圖片:點我查看
import re # \w:匹配字母、數字、下劃線 print(re.findall("\w", 'hello 123_ */-=')) # 執行結果:['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_'] # \W:匹配非字母、數字、下劃線 print(re.findall("\W", 'hello 123_ */-=')) # 執行結果:[' ', ' ', '*', '/', '-', '='] # \s:匹配任意空白字符 print(re.findall("\s", 'hell\no 12\t3_ */-=')) # 執行結果:['\n', ' ', '\t', ' '] # \S:匹配任意非空字符 print(re.findall("\S", 'hell\no 12\t3_ */-=')) # 執行結果:['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '*', '/', '-', '='] # \d:匹配任意數字,等價于[0-9] print(re.findall("\d", 'hell\no 12\t3_ */-=')) # 執行結果:['1', '2', '3'] # \D:匹配任意非數字 print(re.findall("\D", 'hell\no 12\t3_ */-=')) # 執行結果:['h', 'e', 'l', 'l', '\n', 'o', ' ', '\t', '_', ' ', '*', '/', '-', '='] # \n:匹配一個換行符 print(re.findall("\n", 'hell\no 12\t3_ */-=')) # 執行結果:['\n'] # \t:匹配一個制表符 print(re.findall("\t", 'hell\no 12\t3_ */-=')) # 執行結果:['\t'] # 匹配特定字符 print(re.findall("l", 'hell\no 12\t3_ */-=')) # 執行結果:['l', 'l'] print(re.findall("yangy", "yangy my name is yangy, oh yangy is my big baby")) # 執行結果:['yangy', 'yangy', 'yangy'] # ^:以什么開頭 print(re.findall("^yangy", "yangy my name is yangy, oh yangy is my big baby")) # 執行結果:['yangy'] # $:以什么結尾 print(re.findall("yangy$", "yangy my name is yangy, oh yangy is my big baby, yangy")) # 執行結果:['yangy']
② 字符組:
[0-9]:可以匹配到一個0-9的字符
[9-0]:報錯,必須從大到小
[a-z]:從小寫的a-z
[A-Z]:從大寫的A-Z
[z-A]:錯誤,只能從小到大,根據ASCII表來匹配
[A-z]:從大寫的A到小寫的z
注意:順序必須要按照ASCII碼數值的順序來撰寫
import re res = re.match("[A-Za-z0-9]{4}", "Yang9527") print(res) # 默認只獲取一個值,{}里面寫多少就是匹配多少個值 if res: print("匹配成功")
執行結果:
<re.Match object; span=(0, 4), match='Yang'> 匹配成功
③ 組合使用
\w\W:匹配字母、數字、下劃線與非字母數字、下劃線,匹配所有
\d\D:無論是數字或者非數字都可以匹配
\t:table
\n:換行
\b:匹配單詞結尾
^:startswith 以什么開頭
- '^'在外面使用:表示以什么開頭
- [^]用在[]里面:表示取反的意思
$:endswith 以什么結尾
^$:配合使用叫做精準匹配,如何限制一個字串的長度或者內容
|:或. ab|abc如果第一個條件成立,則abc不會執行,怎么解決,針對這種情況把長的寫在前面就好了,一定要將長的放在前面
[^...]:表示取反的意思
[^ab]:代表只取ab以外的字符
[^a-z]:取a-z以外的字符
(?:):表示非捕獲分組,和捕獲分組的唯一區別在于,非捕獲分組匹配的值不會保存起來
# 將res或者y保留與compan進行拼接 print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company'))
執行結果:
['companies', 'company']
補充:貪婪模式和非貪婪模式
貪婪模式:.* 往后一直匹配,匹配到最后一個符合條件的元素結束
非貪婪模式:.*? 往后匹配到第一個符合條件的元素結束,往后繼續匹配 ------> 可以拿來過濾資料
(2)re模塊:
在python中,若想要使用正則運算式,必須通過re模塊來實作
2、為什么要使用正則運算式?
比如要獲取一堆字串中的某些字符,正則運算式可以過濾并提取出想要的字符資料
應用場景:
(1)爬蟲
(2)資料分析過濾資料
(3)用戶名密碼、手機認證:檢測用戶輸入的合法性
3、re模塊中三種比較重要的方法
(1)findall(),回傳串列:
可以匹配所有字符,拿到回傳結果,回傳結果是一個串列,
import re str1 = 'bear blue hung' res1 = re.findall('[a-z]{4}', str1) print(res1)
執行結果:
['bear', 'blue', 'hung']
(2)search(),回傳一個物件,使用.group()取出:
在匹配一個字符成功拿到結果后結束程式,不繼續往后匹配
import re str1 = 'bear blue hung' res2 = re.search("[a-z]{4}", str1) print(res2.group())
執行結果:
bear
(3)match(),回傳物件,使用.group()取出:
從匹配字符的開頭匹配,若開頭不是想要的內容,則回傳None
import re str1 = 'bear blue hung' res3 = re.match("[a-z]{4}", str1) print(res3.group())
執行結果:
bear
例:使用re模塊校驗手機號碼的合法性
需求:11位,開頭是13/14/15/17/18/19
① 不使用re校驗
import re while True: user_number = input("請輸入你的手機號:").strip() if len(user_number) == 11 and (user_number.startswith( "13" ) or user_number.startswith( "14" ) or user_number.startswith( "15" ) or user_number.startswith( "17" ) or user_number.startswith( "18" ) or user_number.startswith( "19" )): print("手機號碼合法!") break else: print("手機號碼不合法")
② 使用re校驗
import re while True: user_number = input("請輸入你的手機號:").strip() # 引數1:正則運算式,引數2:需要過濾的字串 # ^:代表開頭 # $:代表結束 # |:或者的意思 # ():可以獲取一個值,判斷是否是13或14等 # {9}:需要獲取9個值 # []:分組限制取值范圍,[0-9]:限制只能獲取0-9的某一個字符 if re.match("^(13|14|15|17|18|19)[0-9]{9}$", user_number): print("手機號碼合法!") break else: print("手機號碼不合法")
執行結果:
請輸入你的手機號:12222222222 手機號碼不合法 請輸入你的手機號:13333333333 手機號碼合法!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/180715.html
標籤:其他
