Day17 正則表達(dá)式

正則表達(dá)式

  1. 正則表達(dá)式(通用語法)
    正則就是一種用來做字符串匹配的工具疚膊,通過不同的符號匹配不同的字符

  2. python對正則表達(dá)式的支持
    通過re模塊提供相應(yīng)支持正則表達(dá)式的方法
    fullmatch(正則表達(dá)式,匹配的字符串) ---> 用正則表達(dá)式和指定字符串進(jìn)行匹配义辕,如果匹配成功
    返回匹配對象,匹配失敗返回None
    python中的正則表達(dá)式是寫在字符串中的寓盗,但是一般情況下會在前面加r/R

    • 普通字符(代表字符本身

      # 匹配一個(gè)字符串灌砖,只有三個(gè)字符,并且每個(gè)字符分別是a,b,c
      re_str = r'abc'
      result = fullmatch(re_str, 'abc')
      print(result)
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 3), match='abc'>
      
    • . (匹配任意字符) 出現(xiàn)點(diǎn)傀蚌,這個(gè)點(diǎn)可以表示任意字符基显,一個(gè)點(diǎn)代表一個(gè)字符

    """
    注意:a.一個(gè)點(diǎn)代表一個(gè)字符
          b.\n匹配不到
    """
    # 匹配一個(gè)字符串,只有三個(gè)字符善炫,第一個(gè)字符是a,第二個(gè)字符是任意字符撩幽,第三個(gè)字符是c
    re_str = r'a.c'
    result = fullmatch(re_str, 'a\c')
    print(result)
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 3), match='a\\c'>
    
    • \w (匹配一個(gè)表示字母數(shù)字下劃線)
    """
    注意:a.也可以匹配中文
         b.一個(gè)\w只能匹配一個(gè)字符
    """
    # 匹配一個(gè)字符串,第一個(gè)字符串是任意字符销部,第二三個(gè)字符是字母摸航、數(shù)字或者_(dá)制跟,最后三個(gè)是abc
    re_str = r'.\w\wabc'
    result = fullmatch(re_str, '$趙_abc')
    print(result)
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 6), match='$趙_abc'>
    
    • \s (匹配空白字符)
    """
    空白字符:指的是所有能產(chǎn)生空白的字符舅桩,包括空格、制表符雨膨、換行等
    """
    # 匹配一個(gè)字符串擂涛,前兩個(gè)是字母數(shù)字下劃線或者中文,第三個(gè)字符是空白,最后一個(gè)是任意字符
    re_str = r'\w\w\s.'
    result = fullmatch(re_str, 'a_\t$')
    print(result)
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 4), match='a_\t$'>
    
    • \d (匹配數(shù)字字符)

      # 一個(gè)字符串有三個(gè)字符撒妈,每個(gè)字符都是數(shù)字字符
      re_str = r'\d\d\d'
      result = fullmatch(re_str, '789')
      print(result)
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 3), match='789'>
      
    • \b (檢測單詞邊界)

    """
    a.檢測正則表達(dá)式中\(zhòng)b所在的位置是否是單詞邊界
    b.所有可以兩個(gè)單詞區(qū)分開的符號都是單詞邊界
    例如: 空格恢暖,縮進(jìn),標(biāo)點(diǎn)符號,單詞開頭結(jié)尾
    
    注意:\b不是匹配符號狰右,不會匹配出一個(gè)字符杰捂,只能檢測所在的位置是否滿足要求
    """
    # 匹配一個(gè)字符串的內(nèi)容是否是'how are',并且要求a的前面是單詞邊界
    re_str = r'\bhow\b are'
    result = fullmatch(re_str, 'how are')
    print(result)
    print(search(r'\b\d\d\d', 'ada 456qwe123asdasd78'))
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 7), match='how are'>
    <_sre.SRE_Match object; span=(4, 7), match='456'>
    
    • ^ (檢測字符串開頭)

      """
      匹配一個(gè)字符串是三個(gè)數(shù)字字符,并且第一個(gè)字符前所在的位置是字符串開頭棋蚌,寫在正則表達(dá)式前面嫁佳,其他位置無意義
      """
      re_str = r'^\d\d\d'
      result = search(re_str, '789asdjak45897asd78')
      print(result)
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 3), match='789'>
      
    • $ (檢測字符串結(jié)尾)

    # 匹配一個(gè)字符串是三個(gè)數(shù)字字符,并且最后一個(gè)字符的后面是字符串結(jié)尾
    re_str = r'\d\d\d$'
    result = search(re_str, 'asdasda4563')
    print(result)
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(8, 11), match='563'>
    
    • \B (檢測非單詞邊界)

      re_str = r'a\Babc'
      result = search(re_str, 'aabc')
      print(result)
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 4), match='aabc'>
      
    • \W (匹配非數(shù)字字母下劃線中文)

    • \S (匹配非空白字符)

    • \D (匹配非數(shù)字字符)

    • [字符集](匹配字符集中的任意一個(gè)字符)

      """
      a.普通用法
      [字符集]  -  匹配字符集中的任意一個(gè)字符
      b.表示范圍
      [字符1-字符2]  -  匹配字符1到字符2中所有的字符谷暮,要求字符1的編碼值要小于字符2的編碼值
      [a-zA-z123]  -  表示所有字母和123中的任意一個(gè)
      [a-zA-Z\d_]  -  數(shù)字字母下劃線
      """
      # 匹配一個(gè)字符串有4個(gè)字符蒿往,第一個(gè)字符是 a  b  c  中的任意一個(gè),后面是123
      re_str = r'[abc]123'
      result = fullmatch(re_str, 'a123')
      print(result)
      
      # 匹配一個(gè)字符串有4個(gè)字符湿弦,第一個(gè)字符是a-z中的任意一個(gè)瓤漏,中間兩個(gè)是數(shù)字字符,最后一個(gè)字符為1-9中的任意一個(gè)
      re_str = r'[a-z]\d\d[1-9]'
      result = fullmatch(re_str, 's875')
      print(result)
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 4), match='a123'>
      <_sre.SRE_Match object; span=(0, 4), match='s875'>
      
    • [^字符集] - 匹配非字符集中的任意字符

      """
      注意:^  放在[]的對前面才表示匹配不在字符集中的其他任意字符
              如果不放在最前面就表示字符 ^ 本身
      """
      # 匹配一個(gè)字符串颊埃,第一個(gè)字符只要不是abc中的一個(gè) 其他字符都可以蔬充,后面是123
      re_str = r'[^abc]123'
      result = fullmatch(re_str, 's123')
      print(result)
      
      # 匹配一個(gè)字符串,第一個(gè)字符只要不是字母中的一個(gè) 其他字符都可以班利,后面是123
      re_str = r'[^A-Za-z]123'
      result = fullmatch(re_str, '5123')
      print(result)
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 4), match='s123'>
      <_sre.SRE_Match object; span=(0, 4), match='5123'>
      
    • 轉(zhuǎn)義符號

      """
      a.正則中也可以通過在特殊符號前加'\'來隊(duì)符號進(jìn)行轉(zhuǎn)義
      \\ --  \字符
      \.  --  .字符
      注意:轉(zhuǎn)義字符是字符串中的概念娃惯,
              轉(zhuǎn)義符號是正則表達(dá)式的概念
      
      b.除了在中括號中有特殊意義的符號,其他符號放在[]中也表示符號本身
          -  :  在中括號中兩個(gè)字符之間表示誰到誰肥败,如果想要表示他本身趾浅,就不要放在兩個(gè)字符之間,放在開頭或者末尾
          ^  :  在中括號的最前面有特殊意義馒稍,如果想要表示本身皿哨,就不要放在最前面
          ]  :  在[]中表示中括號,要加\
      """
      re_str = r'\d\d\.\d\d'
      print(fullmatch(re_str, '78.45'))
      
      print(fullmatch(r'[.]', '.'))
      print(fullmatch(r'[.]', '2'))
      
      運(yùn)行結(jié)果:
      <_sre.SRE_Match object; span=(0, 5), match='78.45'>
      <_sre.SRE_Match object; span=(0, 1), match='.'>
      None
      

匹配次數(shù)

  1. * (匹配0次或者多次)

    """
    字符*  -  指定的字符出現(xiàn)0次或者多次(這的字符可以是正則符號也可以是普通字符)
    
    a*  -  a出現(xiàn)0次或者多次
    \d  -  任意數(shù)字出現(xiàn)0次或者多次
    [a-z]* - 任意一個(gè)小寫字母出現(xiàn)0次或多次
    """
    # 123前面有0個(gè)或多個(gè)字符纽谒,并且每個(gè)字符都是字符a
    re_str = r'a*123'
    print(re.fullmatch(re_str, 'aa123'))
    print(re.fullmatch(re_str, '123'))
    
    # 123前面有0個(gè)或多個(gè)字符证膨,并且每個(gè)字符都是數(shù)字字符
    re_str = r'[a-z]*123'
    print(re.fullmatch(re_str, 'asd123'))
    print(re.fullmatch(re_str, '123'))
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 5), match='aa123'>
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    <_sre.SRE_Match object; span=(0, 6), match='asd123'>
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    
  2. + (匹配一次或多次)

    re_str = r'[a-z]+123'
    print(re.fullmatch(re_str, 'asd123'))
    print(re.fullmatch(re_str, '123'))
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 6), match='asd123'>
    None
    
  3. ? (匹配0次或1次)

    re_str = r'[a-z]?123'
    print(re.fullmatch(re_str, 'asd123'))
    print(re.fullmatch(re_str, '123'))
    print(re.fullmatch(re_str, 'w123'))
    
    # 練習(xí):寫一個(gè)正則表達(dá)式鼓黔,能夠匹配所有的整數(shù)字符串
        """
        123
        +123
        -123
        0023   不是整數(shù)
        """
        re_str = r'[-+]?[1-9]\d|0*'
        print(re.fullmatch(re_str, '456'))
        print(re.fullmatch(re_str, '+456'))
        print(re.fullmatch(re_str, '0'))
    
    運(yùn)行結(jié)果:
    None
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    <_sre.SRE_Match object; span=(0, 4), match='w123'>
    
  4. {}

    """
    {M,N}  -  匹配M到N次  最少M(fèi)次最多N次
    {M,}   -  最少M(fèi)次
    {央勒,N}  -  最多N次
    {N}    -  只有N次
    
    """
    print(re.fullmatch(r'a{2,5}', 'aaa'))
    
    # 密碼要求:6-16位,只能包含數(shù)字和字母
    re_str = r'[a-zA-z\d]{6,16}'
    print(re.fullmatch(re_str, 'asdasd7896'))
    
    運(yùn)行結(jié)果:
    None
    None
    <_sre.SRE_Match object; span=(0, 1), match='0'>
    <_sre.SRE_Match object; span=(0, 3), match='aaa'>
    <_sre.SRE_Match object; span=(0, 10), match='asdasd7896'>
    

分之和分組

  1. | (分之)
    表達(dá)式1|表達(dá)式2|表達(dá)式3 - 先用表達(dá)式1進(jìn)行匹配澳化,若成功崔步,則成功,不成功就使用表達(dá)式2缎谷,然后依次進(jìn)行
    (三個(gè)表達(dá)式中有一個(gè)成功就成功井濒,若三個(gè)都不滿足就失敗)

  2. () (分組)

    a. 分組 - 將括號的內(nèi)容看成一個(gè)整體
    b. 分組重復(fù) - 在含有分組的正則表達(dá)式中可以再分組的后面通過'\數(shù)字'來重復(fù)前面第幾個(gè)分組匹配到的內(nèi)容
    (\d{2})abc\1 --> 7878

    re_str = r'[a-z]{3}|\d{3}'
    print(re.fullmatch(re_str, '879'))
    
    re_str = r'abc([A-Z]{2}|\d{2})'
    print(re.fullmatch(re_str, 'abc45'))
    
    # (abc){2}  abc作為一個(gè)整體出現(xiàn)2次
    re_str = r'(abc){2}'
    print(re.fullmatch(re_str, 'abcabc'))
    
    re_str = r'\d{2}abc'
    print(re.fullmatch(re_str, '34abc'))
    
    re_str = r'(\d{2})a(\d{3})bc\2'
    print(re.fullmatch(re_str, '34a123bc123'))
    
    運(yùn)行結(jié)果:
    <_sre.SRE_Match object; span=(0, 3), match='879'>
    <_sre.SRE_Match object; span=(0, 5), match='abc45'>
    <_sre.SRE_Match object; span=(0, 6), match='abcabc'>
    <_sre.SRE_Match object; span=(0, 5), match='34abc'>
    <_sre.SRE_Match object; span=(0, 11), match='34a123bc123'>
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瑞你,更是在濱河造成了極大的恐慌酪惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件者甲,死亡現(xiàn)場離奇詭異春感,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虏缸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門甥厦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寇钉,你說我怎么就攤上這事刀疙。” “怎么了扫倡?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵谦秧,是天一觀的道長。 經(jīng)常有香客問我撵溃,道長疚鲤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任缘挑,我火速辦了婚禮集歇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘语淘。我一直安慰自己诲宇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布惶翻。 她就那樣靜靜地躺著姑蓝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吕粗。 梳的紋絲不亂的頭發(fā)上纺荧,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機(jī)與錄音颅筋,去河邊找鬼宙暇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛议泵,可吹牛的內(nèi)容都是我干的占贫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肢簿,長吁一口氣:“原來是場噩夢啊……” “哼靶剑!你這毒婦竟也來了蜻拨?” 一聲冷哼從身側(cè)響起池充,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤桩引,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后收夸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坑匠,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年卧惜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厘灼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片座掘。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绰寞,死狀恐怖池凄,靈堂內(nèi)的尸體忽然破棺而出蛔垢,到底是詐尸還是另有隱情邓馒,我是刑警寧澤棘街,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布怕篷,位于F島的核電站捐川,受9級特大地震影響钻洒,放射性物質(zhì)發(fā)生泄漏奋姿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一素标、第九天 我趴在偏房一處隱蔽的房頂上張望称诗。 院中可真熱鬧,春花似錦头遭、人聲如沸寓免。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽再榄。三九已至,卻和暖如春享潜,著一層夾襖步出監(jiān)牢的瞬間困鸥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工剑按, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疾就,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓艺蝴,卻偏偏與公主長得像猬腰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子猜敢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • from re import fullmatch, search,findall 正則表達(dá)式就是用來檢測字符串是否...
    文_36e3閱讀 390評論 0 0
  • 1.正則基本符號 1.什么是正則表達(dá)式正則表達(dá)式就是字符匹配工具姑荷;是由正則符號和普通字符組成盒延,來匹配不同規(guī)律的字符...
    楊海py閱讀 796評論 0 0
  • 正則表達(dá)式 正則表達(dá)式使用匹配或者秒速字符串的工具。用處:a.判斷字符串是否滿足某個(gè)條件--判斷輸入的字符串是否是...
    文_36e3閱讀 534評論 0 0
  • 夜闌珊鼠冕,酒正酣添寺,西窗微燭映池湯。鳴孤蟬懈费,離人散计露,獨(dú)拾狼藉,對影偷歡憎乙。 將票罐,將,將泞边! 曲悠揚(yáng)该押,意悠長,雨打芭蕉盡消殘...
    無樂之章閱讀 186評論 0 0
  • 飛過河不是一件難事 從來也沒有想到河的那邊去 朝朝暮暮的低頭抬頭 呼吸均勻 神態(tài)自若 在樹梢上侃侃而談 被春天的和...
    團(tuán)結(jié)巷徐閱讀 318評論 1 5