day15-正則表達(dá)式

01-正則表達(dá)式的符號

  • 正則表達(dá)式:用來做字符串查找、匹配、切割用的一種工具

  • python對正則表達(dá)式的支持:提供了re模塊(python內(nèi)置模塊),包含字符串匹配、查找、切割等相關(guān)的方法

  • fullmatch(正則表達(dá)式,字符串):用正則表達(dá)式來和字符串進(jìn)行匹配,看是否能夠匹配成功

  • 正則表達(dá)式:是一個符合正則規(guī)范的字符串

import re

  • 注意:正則表達(dá)式的字符串,前面一般要加r來阻止轉(zhuǎn)義。因為正則表達(dá)式的符號中有很多帶''的符號,其功能不是轉(zhuǎn)義,而是表示特殊的意義
      1. . :匹配一個任意的字符
        """匹配兩個任意字符的字符串"""
        re_str =r'..'
        """匹配第一個字符是a第二個字符是b的字符串"""
        re_str = r'ab'
        """匹配第一個字符是a,第二個字符是任意字符的字符串"""
    re_str = r'a.'
    print(re.fullmatch(re_str,'ab'))
    
  • 2 \w :匹配一個字符是字母、數(shù)字或者下劃線
    """匹配第一個字符是字母、數(shù)字或者下劃線,第二個字符是字母、數(shù)字或者下劃線的字符串"""
     re_str = r'\w\w'
     print(re.fullmatch(re_str,'45'))
    
  • 3 \s :匹配一個空白字符(空格、回車、換行、制表符)
    """匹配第一個字符是a,第二個字符是空白,最后一個字符是b的字符串"""
    re_str = 'a\sb'
    print(re.fullmatch(re_str,'a\nb'))
  • 4 \d :匹配一個數(shù)字字符
    re_str = '\d\d\d'
    print(re.fullmatch(re_str,'123'))
  • 5 \b :檢測邊界(單詞邊界---一般的符號都可以作為單詞邊界)
    """匹配三個任意字符的前面和后面都是單詞邊界的字符串"""
    re_str = r'\b...\b'
    print(re.match(re_str,'asa'))
  • 6.^ :檢測字符串開始(^the -- 匹配以The開頭的字符串)
    re_str = r'^The'
    print(re.fullmatch(re_str,'The'))
    print(re.findall(r'The','dsdsf dhsThe'))
  • 7.$ : 檢測字符串結(jié)束
    re_str = r'abc$'
    print(re.findall(re_str,'dsadafaf abc'))
    1. \W :匹配非字母、數(shù)字、下劃線
    re_str = r'\W\w'
    print(re.fullmatch(re_str,'@d'))
  • 9.\S:匹配非空白字符
    re_str = r'\S\d'
    print(re.fullmatch(re_str,'p8'))
  • 10.\D:匹配非數(shù)字字符
    """匹配第一個字符是非數(shù)字字符,第二個字符是字母、數(shù)字、下劃線"""
    re_str = r'\D\w'

  • 11.\B: 檢測非邊界
    """匹配前面兩個字符是ab,第三個字符是c,并且b后面是一個非邊界"""

    re_str = 'ab\Bc'
    print(re.fullmatch(re_str,'abc'))

02-正則表達(dá)式符號組合

import re
if __name__ == '__main__':
  • 1.[] :匹配[]中出現(xiàn)的任意一個字符
    """匹配一個字符串,前三位是abc,第四位是字符1或字符a"""
    re_str = r'abc[1a]'
    print(re.fullmatch(re_str,'abc1'))

"""第一位是數(shù)字或者下劃線,后面是abc"""

    re_str = r'[\d_]abc'
    print(re.fullmatch(re_str,'9abc'))
  • 2.[^]:匹配不在[]中出現(xiàn)的任意一個字符
    """匹配一個字符串,前三位是abc,第四位不是數(shù)字字符也不是字符a"""
    re_str = r'abc[^\da]'
    print(re.fullmatch(re_str,'abcu'))
    1. *:匹配0次或者多次
      """匹配一個字符串,前面是0個或者多個數(shù)字字符,然后是abc"""
    re_str = r'\d*abc'
    print(re.fullmatch(re_str,'123abc'))
```
[0-9]:匹配0,1,2,3,4,5,6,7,8,9中的任意一個字符
[a-z]:匹配任意一個小寫字母
[A-Z]:匹配任意一個大寫字母
[a-zA-Z]:匹配所有的字母
```
print(re.fullmatch(r'[1-9]','7'))
  • 寫一個正則表達(dá)式,判斷一個字符串是數(shù)字字符串(不能是空串)
    re_str = r'\d\d*'  #或者re_str = r'[0-9][0-9]*'
    print(re.fullmatch(re_str,'1212'))
  • 寫一個正則表達(dá)式,檢測一個字符串是否是合格的標(biāo)識符(字母數(shù)字下劃線注冊,數(shù)字不能開頭)
    re_str = r'[a-zA-Z_]\w*'
    print(re.fullmatch(re_str,'&s3as645_'))
  • 4.+ :匹配一次或者多次
    """匹配一個字符串開頭出現(xiàn)一次或者多次數(shù)字字符,然后再有0次或者多次數(shù)字、字母、下劃線"""
    re_str = r'\d+\w*'
    print(re.fullmatch(re_str,'1abc'))
  • 5.?: 匹配0次或者一次
    re_str = r'[a-z]?123'
    print(re.fullmatch(re_str,'123'))
  • 判斷一個字符串是否是正整數(shù)字符串'123' or '+123' ->成功 '0123'->None
    re_str = r'[+]?[1-9]\d*'
    print(re.fullmatch(re_str,'+123'))
  • 6.{N}匹配N次
    """前面5個數(shù)字,然后是abc"""
    re_str = r'\d{5}abc'
    print(re.fullmatch(re_str,'12123abc'))
  • 7.{N,}: 匹配大于等于N次
    """字符串前面至少三位數(shù)字"""
    re_str = r'\d{3,}.*'
    print(re.fullmatch(re_str,'4546ds'))
  • 8.{M,N}匹配至少M次,最多N次
    """密碼要求:數(shù)字、字母組成,并且8-16位"""
    re_str = r'[\da-zA-Z]{8,16}'
    print(re.fullmatch(re_str,'46565sas'))
    1. | 分支
      """匹配一個字符串,是三個數(shù)字字符或者是三個小寫字符"""
    re_str = r'\d{3}|[a-z]{3}'
    print(re.fullmatch(re_str,'wba'))
  • 10.()匹配的時候是分組,讓括號中的正則條件變成一個整體
    """匹配一個字符串,abc整體重復(fù)三次"""
    re_str = r'(abc){3}'
    print(re.fullmatch(re_str,'abcabcabc'))

    re_str = r'(\d\w[0-3]){2}'
    print(re.fullmatch(re_str,'3o37h1'))
"""==========以下了解============"""
# 盡可能少:在能夠匹配到的前提下盡可能的少
# 11.*?重復(fù)任意次,盡可能的少重復(fù)
re_str = r'a*?'
print(re.match(re_str,'aaaa'))

# 12.+?重復(fù)一次或多次,盡可能少的重復(fù)
re_str = r'ba+?'
print(re.match(re_str,'baaaaa'))

# 13.?? 重復(fù)0次或者1次,盡可能少的重復(fù)
re_str = r'b??'

03-正則表達(dá)式

  • 正則中:.\ [] {}() * + ? ^ $ |, 這些字符有特殊意義,所以在正則表達(dá)式中如果想要單純的表達(dá)這些字符,需要在前面加''

  • 注意:1.- 在中括號中可能是特殊的符號
    2..{} () * + ? $ | 在中括號中可以不用加\,來表示字符

import re
if __name__ == '__main__':
    re_str = r'\d+\.\d+'
    print(re.fullmatch(re_str,'12.56'))


    re_str = r'[\^]'#匹配 字符 ^
    re_str = r'[\\]'#匹配 字符 \
    re_str = r'\$'
    print(re.fullmatch(re_str,'\\'))
  • 1.\N - -> 匹配前面第N個組中匹配到的內(nèi)容
    re_str = r'([1-9][a-z]{2})\1'
    print(re.fullmatch(re_str,'8hh8hh'))
  • 用戶名必須由字母、數(shù)字或下劃線構(gòu)成且長度在6-20個字符之間
    QQ號是5-12位的數(shù)字且首位不能為0
    re_str = r'\w{6,20}'
    print(re.fullmatch(re_str,'dsdsdsde'))
    re_str = r'[1-9]\d{4,11}'
    print(re.fullmatch(re_str,'939138680'))
  • IP地址是否合法
    """
    x.x.x.x
    寫一個正則表達(dá)式判斷一個字符串是否是:1-255
    """
    re_str = r'((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[1-9])\.){3}((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[1-9]))'

04-re模塊方法

import re
if __name__ == '__main__':
  • 1.compile(正則字符串) 將正則表達(dá)式字符串轉(zhuǎn)換成正則表達(dá)式對象
# 轉(zhuǎn)換成正則表達(dá)式對象后,可以通過對象調(diào)用相關(guān)的方法
re_object = re.compile(r'\w{6,12}')
print(re_object.fullmatch('ahsjjs'))
  • 2.fullmatch(正則表達(dá)式,字符串)完全匹配,從字符串開頭匹配到結(jié)尾
# 返回值是匹配對象,如果匹配失敗,返回None
match = re.fullmatch('\w{3}','h3s')
print(match)
# a.獲取匹配到的結(jié)果
print(match.group())
# b.獲取匹配到的范圍
print(match.span())
# c.獲取匹配到的開始下標(biāo)和結(jié)束下標(biāo)
print(match.start(),match.end())
# d.獲取被匹配的字符串(原字符串)
print(match.string)
# 應(yīng)用:判斷一個字符串是否是某種字符串(判斷賬號、密碼是否符合要求等)
  • 3.match(正則表達(dá)式,字符串) 不完全匹配,從字符串開頭開始匹配,匹配到正則表達(dá)式對應(yīng)的范圍為止
# 返回值是匹配對象,如果匹配失敗,返回None
match = re.match('\w{3}','h3shhh')
print(match)
print(match.group())
print(match.string)
# 應(yīng)用:判斷一個字符串是否以某種字符串開頭
  • 4.re.search(正則表達(dá)式,字符串),在指定的字符串中查找某種字符串(以正則表達(dá)式來描述)
# 如果有多個滿足條件的,只匹配到第一個
# 返回值是匹配對象,如果找不到符合要求的返回None

print(re.search(r'\d{2,}[a-z]','sha23n--870899'))
# 應(yīng)用:判斷一個字符串是否包含某種字符串
  • 5.findall(正則表達(dá)式,字符串)去獲取指定字符串中滿足正則條件的所有的子串
# 返回值是列表,列表中是符合要求的字符串,沒有滿足要求的子串就返回[]
result = re.findall(r'\D\d+\D','a123buye236oks')
print(result)
  • 注意:在通過正則表達(dá)式獲取子串的時候,可以通過在正則表達(dá)式中添加括號,來約束獲取的內(nèi)容,只獲取括號中匹配到的內(nèi)容匹配的時候還是按原正則表達(dá)式去查找
    應(yīng)用:字符串提取

  • 6.finditer(正則表達(dá)式,字符串)用法和findall一樣,只是返回值的類型不一樣
    返回一個迭代器,迭代器中的內(nèi)容是匹配對象
    注意:()捕獲部分無效

    result = re.finditer(r'\D\d+\D', 'a123buye236oks')
    for match in result:
        print(match)
  • 7.split(正則表達(dá)式,字符串) 按正則表達(dá)式匹配到的字符串進(jìn)行切割
# 返回值是列表,列表元素就是切割后被分段的字符串
    result = re.split(r'\d+','dsfdw12e7rvx8qdw')
    print(result)
  • 8.sub(正則表達(dá)式,替換字符串,原字符串) 在原字符串中查找符合正則的子串,替換成新的字符串
    返回值是替換后的字符串
    """將指定字符串中所有的‘sb’替換成 * """
    str1 = '你好sb,你全家都是sb'
    result = re.sub(r'sb','*',str1)
    print(result)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • python的re模塊--細(xì)說正則表達(dá)式 可能是東半球最詳細(xì)最全面的re教程,翻譯自官方文檔,因為官方文檔寫的是真...
    立而人閱讀 23,435評論 4 46
  • Python中的正則表達(dá)式(re) import rere.match #從開始位置開始匹配,如果開頭沒有則無re...
    BigJeffWang閱讀 7,593評論 0 99
  • 搞懂Python 正則表達(dá)式用法 Python 正則表達(dá)式 正則表達(dá)式是一個特殊的字符序列,它能幫助你方便的檢查一...
    廈熱閱讀 1,776評論 0 2
  • 第一章:轉(zhuǎn)學(xué)生,你好??! 今年,我高二了,是一個名副其實的逗比學(xué)霸,哦不,學(xué)神!在每一次考試從沒有下過第一名...
    ezjWVAE閱讀 225評論 0 1
  • 又是高溫的一天,走出房間熱浪不斷的撲在臉上,令人煩躁不已。 樹上的夏蟬扯著嗓子叫個不停,宛如也在咒罵這火爐...
    柳心羽閱讀 190評論 0 0

友情鏈接更多精彩內(nèi)容