<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python中正則表達(dá)式模塊詳解

          共 3646字,需瀏覽 8分鐘

           ·

          2020-09-16 11:29

          作者:python
          來源:SegmentFault 思否社區(qū)



          正則表達(dá)式

          用來處理字符串,對字符串進(jìn)行檢索和替換,另外正則在python爬蟲的應(yīng)用也是相當(dāng)廣泛!?

          特點
          • 靈活性、邏輯性和功能性非常強(qiáng)?
          • 可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制

          正則語法

          `#?1、數(shù)字和字母都表示它本身,?.?表示匹配除了換行以外的任意字符,????.?表示匹配?.
          #?2、很多字母前面添加??會有特殊含義
          ????-?n:換行
          ????- t:制表符
          ????-?d:?匹配數(shù)字,等價[0-9]
          ????-?D:非數(shù)字,等價于[^0-9]
          ????-?w:表示數(shù)字、字母以及下劃線,中文,等價于[0-9a-zA-Z_]
          ????- W:表示w取反
          ????-?s:表示任意的非打印字符(空格、換行、制表符)
          ????-?S:表示非空白字符
          #?3、絕大多數(shù)標(biāo)點都有特殊含義
          ????-?():用來表示一個分組,如果需要表示括號,需要使用?
          ????-?[]:?匹配范圍,[0-9]?表示0~9范圍中的一個,[0-9a-zA-Z]
          ????-?|:?表示或者的意思?re.search(r'f(x|y|z)m','pdsfxm')???匹配fxm
          ????-?{},{2,},{,3},{1,3}:用來限定前面元素出現(xiàn)的次數(shù)??re.search(r'go{2}d','good')
          ????-?*:?表示前面的元素出現(xiàn)的次數(shù)為0次及以上,等價于{0,}
          ????-?+:?表示前面的元素出現(xiàn)的次數(shù)為1次及以上,等價于{1,}
          ????-?^:以指定的內(nèi)容開頭,或者取反的意思
          ????-?$:以指定的內(nèi)容結(jié)尾
          #?4、???的兩種用法
          ????-?規(guī)定前面元素出現(xiàn)的次數(shù)最多只能出現(xiàn)1次,等價于{,1}
          ????-?將貪婪模式轉(zhuǎn)換為非貪婪模式(重點)`?



          re模塊的介紹


          XM返傭 https://www.fx61.com/brokerlist/xm.html
          該模塊是python中專門用于處理正則的默認(rèn),提供了相關(guān)的方法

          常用方法


          • match、search 只查詢一次

          • finditer 查找到所有的匹配數(shù)據(jù)放到一個可迭代對象中

          • findall 把查找到的所有字符串結(jié)果放到一個列表中

          • fullmatch 完全匹配,字符串需要滿足正則表達(dá)式



          Match類的使用


          調(diào)用re.match,re.search或者對re.finditer的遍歷返回的對象都是re.Match對象

          Match類的屬性和方法


          • pos、endpos 被查找字符串的起始和終端位置
          • span( ) 匹配到的下標(biāo)位置(元組)
          • group 分組的概念
          `import?re

          m?=?re.search(r'c.*z',?'abcdefgz')
          print(m.pos)??#?0
          print(m.endpos)??#?8
          print(m.span())??#?(2,?8)
          #?使用group獲取獲取到匹配的字符串
          print(m.group())?#?cdefgz

          #?group表示正則表達(dá)式的分組
          #?1、在正則表達(dá)式里使用()表示一個分組
          #?2、如果沒有分組,默認(rèn)只有一組
          #?3、分組的下標(biāo)從0開始

          #?這里有4個分組?
          m1?=?re.search(r'(1.*)(2.*)(3.*4)',?'a1bcd2efgh3ij4k')
          print(m1.group())??#?默認(rèn)就是第0組??1bcd2efgh3ij4
          print(m1.group(0))??#?第0組就是把整個正則表達(dá)式當(dāng)做一個整體??1bcd2efgh3ij4
          print(m1.group(1))??#?1bcd
          print(m1.group(2))??#?2efgh
          print(m1.group(3))??#?3ij4

          #??groups()?將分組以元組的形式返回
          print(m1.groups())??#?('1bcd',?'2efgh',?'3ij4')

          #?(?P?表達(dá)式)?給分組取個名字
          m2?=?re.search(r'(?P1.*)(?P2.*)(?P3.*4)',?'a1bcd2efgh3ij4k')
          print(m2.groupdict())??#?{'one':?'1bcd',?'two':?'2efgh',?'three':?'3ij4'}`?


          • compile?
            在re模塊,可以使用re.方法調(diào)用函數(shù),還可以調(diào)用re.compile得到一個對象
          `import?re

          #?這兩種寫法沒有區(qū)別
          m?=?re.search(r'm.*a',?'111m22222a')
          print(m)??#?

          m2?=?re.compile(r'm.*a')
          result?=?m2.search('111m22222a')
          print(result)?#?`?



          正則修飾符


          正則修飾符是對表達(dá)式進(jìn)行修飾
          • re.I 使匹配對大小寫不敏感
          • re.M 多行匹配,影響 ^ 和$
          • re.S 使 . 匹配包括換行在內(nèi)的所有字符

          `import?re

          #?.?表示除了換行以外的任意字符
          x?=?re.search(r'm.*a',?'abcdmonxxxa')
          print(x)??#?None

          #?re.S?匹配換行
          y?=?re.search(r'm.*a',?'abcdmonxxxa',?re.S)??#?讓?.?匹配換行
          print(y)

          a?=?re.search(r'x',?'helloXyz')
          print(a)??#?None
          #?re.I?忽略大小寫
          b?=?re.search(r'x',?'helloXyz',?re.I)
          print(b)??#?

          #?re.M?讓$?匹配到換行
          m?=?re.findall(r'w+$',?'i?am?boyn?you?are?girln?he?is?man')
          print(m)??#?['man']
          n?=?re.findall(r'w+$',?'i?am?boyn?you?are?girln?he?is?man',?re.M)
          print(n)?#?['boy',?'girl',?'man']`?



          正則替換

          sub
          `import?re

          #?把數(shù)字替換成x
          m?=?re.sub(r'd',?'x',?'hello123wor123ld')
          print(m)??#?helloxxxworxxxld

          n?=?re.sub(r'd+',?'x',?'hello123wor123ld')
          print(n)?#?helloxworxld

          #?需求:將p中內(nèi)容的數(shù)字乘2
          p?=?'hello50good34'
          def?test(x):
          ????y?=?int(x.group(0))
          ????y?*=?2
          ????return?str(y)??#?這里只能以字符串的形式返回

          print(re.sub(r'd+',?test,?p))?#?hello100good68`?


          貪婪模式與非貪婪模式


          在正則表達(dá)式里,默認(rèn)采用的是貪婪模式,盡可能匹配多的字符串 在貪婪模式后面添加?,可將貪婪模式轉(zhuǎn)化為非貪婪模式

          import?re

          m?=?re.search(r'm.*a',?'abcm123a456a')
          print(m)??# m123a456a,這里為什么不是m123a呢?因為這里默認(rèn)使用的貪婪模式
          n?=?re.search(r'm.*?a',?'abcm123a456a')
          print(n)??#?m123a????使用?將貪婪模式轉(zhuǎn)化為非貪婪模式

          #??
          print(re.match(r'aa(d+)',?'aa123bb456').group(1))??#?123
          print(re.match(r'aa(d+?)',?'aa123bb456').group(1))??#?1
          print(re.match(r'aa(d+?)',?'aa123bb456').group(0))??#?aa1

          #?雖然說是盡可能少的匹配,但也要滿足匹配呀
          print(re.match(r'aaa(d+)ddd',?'aaa2333ddd').group(0))??#?aaa2333ddd
          print(re.match(r'aaa(d+?)ddd',?'aaa2333ddd').group(1))??#?2333

          print(re.match(r'aaa(d+).*',?'aaa2333ddd').group(0))??#?aaa2333ddd
          print(re.match(r'aaa(d+?).*',?'aaa2333ddd').group(1))??#?2



          點擊左下角閱讀原文,到?SegmentFault 思否社區(qū)?和文章作者展開更多互動和交流。


          -?END -

          瀏覽 29
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大香蕉中文在线 | 一级A片免费视频 | 亚洲色图欧美另类 | 国产毛片18水真多18精品 | 亚洲激情操逼 |