濮阳杆衣贸易有限公司

主頁 > 知識庫 > 深入淺析正則表達式re模塊(部分)

深入淺析正則表達式re模塊(部分)

熱門標簽:貴港公司如何申請400電話 外呼系統(tǒng)無呼出路由是什么原因 ai電話機器人搭建 400電話辦理電話辦理 甘肅醫(yī)療外呼系統(tǒng)排名 呼叫系統(tǒng)外呼只能兩次 地圖標注教學點 梅縣地圖標注 西藏智能外呼系統(tǒng)代理商

正則表達式:

官方定義:正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。

​ 什么是正則表達式: 一套規(guī)則 - 匹配字符串的

​ 談到正則,就只和字符串相關了。我們要考慮的是在同一個位置上可以出現(xiàn)的字符的范圍。

​ 正則表達式能做什么:

•1.檢測一個輸入的字符串是否合法 -- web開發(fā)項目 表單驗證 ◦用戶輸入一個內容的時候,我們要提前做檢測
◦能夠提高程序的效率并且減輕服務器的壓力

•2.從一個大文件中找到所有符合規(guī)則的內容 -- 日志分析\爬蟲 ◦能夠高效的從一大段文字中快速找到符合規(guī)則的內容

字符組 : [字符組]

在同一個位置可能出現(xiàn)的各種字符組成了一個字符組,在正則表達式中用[]表示。一個中括號只表示一個字符位置
 字符分為很多類,比如數(shù)字、字母、標點等等。假如你現(xiàn)在要求一個位置"只能出現(xiàn)一個數(shù)字",那么這個位置上的字符只能是0、1、2...9這10個數(shù)之一。
     字符組 描述的是一個位置上能出現(xiàn)的所有可能性
    # 接受范圍,可以描述多個范圍,連著寫就可以了
    # [abc]    一個中括號只表示一個字符位置,匹配a或者b或者c
    # [0-9]     匹配數(shù)字0-9,根據(jù)ASCII進行范圍的比對
    # [a-z]     匹配所有的小寫字母
    # [A-Z]     匹配所有的大寫字母
    # [a-zA-Z]  匹配所有的大小寫字母
    # [0-9a-z]
    # [0-9a-zA-Z_]

元字符:

        字符:

        元字符           匹配內容的規(guī)則
        .               匹配除換行符以外的任意字符
        \w              匹配字母或數(shù)字或下劃線
        \s              匹配任意的空白符
        \d              匹配數(shù)字
        \n              匹配一個換行符
        \t              匹配一個制表符
        \b              匹配一個單詞的結尾
        ^               匹配一個字符串的開始
        $               匹配一個字符串的結尾
        \W              匹配非字母或數(shù)字或下劃線
        \D              匹配非數(shù)字
        \S              匹配非空白符
        a|b             匹配字符a或字符b
        a表達式|b表達式   匹配a或者b表達式中的內容,如果匹配a成功了,不會繼續(xù)和b匹配, 所以,如果兩個規(guī)則有重疊部分,總是把長的放在前面
        ()              分組,匹配括號內的表達式,也表示一個組。約束某一個元字符的作用范圍,只在()內生效
        []              字符組,匹配字符組中的字符
        [^]             非字符組,匹配除了字符組中字符的所有字符
        在正則表達式中能夠幫助我們表示匹配的內容的符號都是正則中的 元字符
        # [0-9]        -->  \d   表示匹配一位任意數(shù)字 digit
        # [0-9a-zA-Z_] -->  \w   表示匹配數(shù)字字母下劃線 word
        # 空格 -->
        # tab  -->  \t
        # enter回車  -->  \n
        # 空格,tab和回車 --> \s  表示所有空白 包括空格 tab和回車
        # [\d]  \d  表示匹配數(shù)字
        # [\d\D] [\w\W] [\s\S]  表示匹配所有
        # [^\d]  匹配所有的非數(shù)字
        # [^1]  匹配除數(shù)字1以外的所有  
        # [1-9]\d 匹配兩位整數(shù)
        # [1357]\d  匹配1,3,5,7,開頭的兩位整數(shù)
              例1:匹配多個網址:
             www\.oldboy\.com|www\.baidu\.com|www\.jd\.com|www\.taobao\.com     #\.表示取消.的特殊意義
             www\.(oldboy|baidu|jd|taobao)\.com    #用() 來約束 | 描述的內容的范圍      
        記憶元字符 : 都是表示能匹配哪些內容,一個元字符總是表示一個字符位置上的內容
        # \d \w \s \t \n \D \W \S
        # [] [^] .
        # ^ $
        # | ()

量詞:

        量詞  用法說明
        *      重復0次或更多次,表示0次或多次    {0,}
        +      重復1次或更多次,表示1次或多次    {1,}
        ?      重復0次或1次,表示匹配0次或1次    {0,1}
        {n}    重復n次,表示匹配n次
        {n,}   重復n次或更多次,表示匹配至少n次
        {n,m}  重復n到m次,表示至少匹配n次,至多m次
        例:
            匹配整數(shù) \d+
            匹配小數(shù) \d+\.\d+
            匹配整數(shù)或小數(shù) : \d+\.?\d* #存在問題,比如1.也會被匹配到   --->  分組的作用 : \d+(\.\d+)?
        例:匹配手機號碼,手機號以1開頭,第二位為3-9,總共11位             
            1[3-9]\d{9}

            #判斷用戶輸入的內容是否合法,如果用戶輸入的對就能查到結果,如果輸入的不對就不能查到結果
                 ^1[3-9]\d{9}$
            # 從一個大文件中找到所有符合規(guī)則的內容
                 1[3-9]\d{9}  

轉義符:

 原本有特殊意義的字符,到了表達它本身的意義的時候,需要轉義。     

     . 有特殊的意義,取消特殊的意義\.

  有一些有特殊意義的內容,放在字符組中,會取消它的特殊意義
                #只表示符號本身
          [().*+?] 所有的內容在字符組中會取消它的特殊意義        
         #表示:a-c (a減c)
          [a\-c]  -在字符組中表示范圍,如果不希望它表示范圍,需要轉義,或者放在字符組的最前面\最后面 。
 取消一個元字符的特殊意義有兩種方法:
        1. 在這個元字符前面加\
        2. 對一部分字符生效,把這個元字符放在字符組里
            # [.()+?*]

貪婪匹配:

 1.貪婪匹配:在量詞范圍允許的情況下,盡量多的匹配內容   
  .*x 表示匹配任意字符 任意多次數(shù) 遇到最后一個x才停下來  
  回溯算法: 
 2.非貪婪(惰性)匹配: 總是在量詞范圍內盡量少的匹配內容。前面的*,+等都是貪婪匹配,也就是盡可能匹配,后面加?號使其變成惰性匹配  
  .*?x 表示匹配任意字符 任意多次數(shù) 但是一旦遇到x就停下來
  .+?x 匹配任意內容至少1次 遇到x就停止  
  元字符+量詞+? ---> 惰性匹配  
  幾個常用的非貪婪匹配:
   *? 重復任意次,但盡可能少重復
   +? 重復1次或更多次,但盡可能少重復
   ?? 重復0次或1次,但盡可能少重復
   {n,m}? 重復n到m次,但盡可能少重復
   {n,}? 重復n次以上,但盡可能少重復
   例:匹配身份證號碼:18/15位的身份證號
 # 15位:首位數(shù)字為1-9,總共15位
  [1-9]\d{14}
 # 18位:首位數(shù)字為1-9,末位為0-9或者X,總共18位
   [1-9]\d{16}[\dx]
   [1-9]\d{16}[0-9x]
 #1:
  [1-9]\d{16}[0-9x]|[1-9]\d{14}   #從一個大文件中找到所有符合規(guī)則的內容。表示先匹配[1-9]\d{16}[0-9x]如果沒有匹配上就匹配[1-9]\d{14}
  ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$  #檢測一個輸入的字符串是否合法
 #2:簡化
  [1-9]\d{14}(\d{2}[\dx])?  #從一個大文件中找到所有符合規(guī)則的內容
  ^[1-9]\d{14}(\d{2}[\dx])?$  #檢測一個輸入的字符串是否合法 。()表示分組,將\d{2}[\dx]分成一組,就可以整體約束他們出現(xiàn)的次數(shù)為0-1次
  例:
 規(guī)則:1\d*?3 待匹配內容:1243333344  匹配結果:1243
 規(guī)則:1\d*3  待匹配內容:1243333344  匹配結果:12433333
re模塊:
# findall 還是按照完整的正則進行匹配,只是顯示括號里匹配到的內容。 取所有符合條件的,優(yōu)先顯示分組中的。
 ret = re.findall('9\d\d','19740ash93010uru')
 print(ret)#['974', '930']
 ret = re.findall('9(\d)\d','19740ash93010uru')
 print(ret)#['7', '3']
# search 還是按照完整的正則進行匹配,顯示也顯示匹配到的第一個內容,但是我們可以通過給group方法傳參數(shù),來獲取具體分組,即()中的內容。
 search 只取第一個符合條件的,沒有優(yōu)先顯示這件事兒
 得到的結果是一個變量
  變量.group() 的結果 完全和 變量.group(0)的結果一致
  變量.group(n) 的形式來指定獲取第n個分組中匹配到的內容
 ret = re.search('9(\d)(\d)','19740ash93010uru')
 print(ret) # 變量 _sre.SRE_Match object; span=(1, 4), match='974'>
 if ret:
  print(ret.group())#974 #ret.group(0) 0 默認不寫
  print(ret.group(1))#7
  print(ret.group(2))#4
# 為什么在search中不需要分組優(yōu)先 而在findall中需要?
 加上括號是為了對真正需要的內容進行提取。 為什么要用分組? 把想要的內容放分組里
 如果我們要查找的內容在一個復雜的環(huán)境中,我們要查的內容并沒有一個突出的 與眾不同的特點 甚至會和不需要的雜亂的數(shù)據(jù)混合在一起,這個時候我們就需要把所有的數(shù)據(jù)都統(tǒng)計出來,然后對這個數(shù)據(jù)進行篩選,把我們真正需要的數(shù)據(jù)對應的正則表達式用()圈起來,這樣我們就可以篩選出真正需要的數(shù)據(jù)了。
# 如何取消分組優(yōu)先
 如果在寫正則的時候由于不得已的原因,導致不要的內容也得寫在分組里,通過 ?: 取消這個分組的優(yōu)先顯示
 # (?:) 取消這個分組的優(yōu)先顯示
#findall
 ret = re.findall('\w+>(\w+)/\w+>','h1>askh930s02391j192agsj/h1>')
 print(ret)#['askh930s02391j192agsj']
# search
 ret = re.search('(\w+)>(\w+)/\w+>','h1>askh930s02391j192agsj/h1>')
 print(ret.group())#h1>askh930s02391j192agsj/h1>
 print(ret.group(1))#h1
 print(ret.group(2))#askh930s02391j192agsj
#從exp中匹配出第一個加法,第一個減法, a+b 或者是a-b 并且計算他們的結果
  exp = '2-3*(5+6)'
  ret = re.search('(\d+)[+](\d+)',exp)
  print(ret)
  print(ret.group(1))#5
  print(ret.group(2))#6
  print(int(ret.group(1)) + int(ret.group(2)))#11
 #將豆瓣源碼放到douban.html,從中獲取電影名:
 with open('douban.html',encoding='utf-8') as f:
  content = f.read()
 ret = re.findall('span class="title">(.*?)/span>(?:\s*span class="title">.*?/span>)?',content)
 print(ret)
 #除了 霸王別姬,其他電影都是 肖申克的救贖 這種格式的。
 (.*?) 要顯示的電影名 其中 ?是非貪婪匹配的標志
 (?:\s*span class="title">.*?/span>)?
 ?: 取消這個分組的優(yōu)先顯示,整個()內都不顯示  \s* 兩行代碼之間所有的空字符 
 .*? 電影英文名         ? 該部分出現(xiàn)0次 或者1次
# 什么是爬蟲
 # 通過代碼獲取到一個網頁的源碼,需要的是源碼中嵌著的網頁上的內容 -- 正則表達式
 #先安裝擴展模塊 File--Settings--Project Interpreter-- + --找到包---Install Package
 import requests
 ret = requests.get('https://movie.douban.com/top250?start=0filter=')
 print(ret.content.decode('utf-8'))

總結

以上所述是小編給大家介紹的深入淺析正則表達式re模塊(部分),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • 淺談python中的正則表達式(re模塊)
  • Python的re模塊正則表達式操作
  • Python基礎教程之正則表達式基本語法以及re模塊
  • python正則表達式re模塊詳解
  • python正則表達式re模塊詳細介紹
  • python的正則表達式re模塊的常用方法
  • PYTHON正則表達式 re模塊使用說明

標簽:大興安嶺 涼山 ???/a> 常州 本溪 湖州 泰安 哈密

巨人網絡通訊聲明:本文標題《深入淺析正則表達式re模塊(部分)》,本文關鍵詞  深入,淺析,正則,表達式,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《深入淺析正則表達式re模塊(部分)》相關的同類信息!
  • 本頁收集關于深入淺析正則表達式re模塊(部分)的相關信息資訊供網民參考!
  • 推薦文章
    丰台区| 威信县| 宜春市| 留坝县| 酒泉市| 丹巴县| 德格县| 柘城县| 鄂尔多斯市| 康平县| 炉霍县| 金华市| 镇原县| 南汇区| 八宿县| 周口市| 霍城县| 扶沟县| 县级市| 肃南| 庆元县| 丹凤县| 邓州市| 六安市| 绍兴县| 海伦市| 保靖县| 台山市| 江油市| 育儿| 香格里拉县| 白玉县| 乐东| 疏附县| 郁南县| 龙泉市| 武乡县| 乐昌市| 共和县| 香港| 龙岩市|