日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day16-正则表达式

發布時間:2023/12/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day16-正则表达式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

day16

總結

1.正則表達式

  • 檢測字符

    • \b - 檢測是否是單詞邊界(檢測用,不做匹配用)

      """ 單詞邊界: 凡是可以兩個單詞分開的符號都是單詞邊界, 比如:空白字符,標點符號對應的字符,字符串開頭和結束注意:檢測類符號是在匹配成功的情況霞看檢測類符號所在的位置是否符合要求。 """ result = fullmatch(r'how \bare', 'how are') print(result) # <re.Match object; span=(0, 7), match='how are'>result = findall(r'\b\d\d\b', '13 44 3524') print(result) # ['13', '44']
    • \B - 檢測是否不是單詞邊界

      result = findall(r'\B\d\d\B', '13 44 3524') print(result) # ['52']
    • ^ - 檢測是否是字符串開頭

      result = findall(r'^ab', 'ab43245') print(result) # ['ab']
    • $ - 檢測是否是單詞結尾

      result = findall(r'123$', 'abc123') print(result) # ['123']
  • 匹配次數

    • * - 0次或者多次

      result = findall(r"[0-9a-zA-Z]*", '14fa4f2') print(result) # ['14fa4f2', '']# 非貪婪 result = findall(r"[0-9a-zA-Z]*?[0-9]", '14fa4323f2') print(result) # ['1', '4', 'fa4', '3', '2', '3', 'f2']
    • + - 1次或者多次

    • ? - 0次或者1次

    • {N, M} - 匹配[N, M]次

      # {N} - 匹配N次 # {N,} - 至少匹配N次 # {,M} - 最多匹配M次 re_str = r'\d{2,}' result = fullmatch(re_str, '14124') print(result) # <re.Match object; span=(0, 5), match='14124'>
    • 貪婪和非貪婪

      """ 在匹配次數不確定的時候才有貪婪和非貪婪兩種模式。 貪婪:在能匹配成功的前提下取匹配次數最多的次數。(默認) 非貪婪:在能匹配成功的前提下去匹配次數最少的次數。(在匹配次數后加?) """re_str = r'a.+b' re_str2 = r'a.+?b' print(fullmatch(re_str, 'a身上發欸b發i額bfae ifa2479bfaeb')) # <re.Match object; span=(0, 26), match='a身上發欸b發i額bfae ifa2479bfaeb'> print(match(re_str, 'a身上發欸b發i額bfae ifa2479bfaeb')) # <re.Match object; span=(0, 26), match='a身上發欸b發i額bfae ifa2479bfaeb'> print(match(re_str2, 'a身上發欸b發i額bfae ifa2479bfaeb')) # <re.Match object; span=(0, 6), match='a身上發欸b'>
  • 分組和分支

    • 分組 - ()

      """ 用法1: 將正則表達式中的一部分作為一個整體,進行整體相關操作,比如控制次數 用法2: 重復-使用\M來重復前面第M分分組中的內容 """# 用法1: 將正則表達式中的一部分作為一個整體,進行整體相關操作,比如控制次數 # ‘aaf123fae345fae453' re_str = r'([a-z]{3}\d{3}){3,}' print(match(re_str, 'aaf123fae345fae453'))re_str = r'(https?:\\\\)?(\d+\.){3}\d+' print(search(re_str, r'https:\\114.114.114.114').groups())# 用法2: 重復-使用\M來重復前面第M分分組中的內容 # '34abc34' '78abc78' '1234fae1234' re_str = r'(\d\d)abc\1' print(match(re_str, '34abc34')) # <re.Match object; span=(0, 7), match='34abc34'>re_str = r'(\d{2})=([\u4e00-\u9fa5])=\2=\1' print(fullmatch(re_str, '12=號=號=12').groups()) # ('12', '號') print(findall(re_str, '12=號=號=12 13=號=號=13')) # [('12', '號')]
    • 分支 - |

      """ 正則表達式1|正則表達式2 - 先讓正則1和字符串進行匹配,如果成功就成功,如果失敗就和正則2進行匹配如果正則2成功結果匹配成功,否則匹配失敗。(兩個正則中只有一個可以匹配成功) """re_str = r'\d{2}abc|[A-Z]{3}abc' print(fullmatch(re_str, '12abc')) # <re.Match object; span=(0, 5), match='12abc'>re_str = r'(\d{2}|[A-Z]{3})abc' print(fullmatch(re_str, '12abc')) # <re.Match object; span=(0, 5), match='12abc'>
  • 轉義符號

    # 在本身具備特殊功能或者特殊意義的符號加\,讓其功能或者意義消失,表示一個不同符號re_str = r'[1-9]\d\.\d{2}' print(fullmatch(re_str, '50.12')) # <re.Match object; span=(0, 5), match='50.12'># 注意:獨立具備特殊功能的符號在[]中功能會自動消失,例如:+、*、?、.、(、)等 # 本身在[]中有特殊意義的就要特別注意: ^,-,[,]
  • re模塊

    • compile() - 創建一個正則表達式對象

      # re.compile(正則表達式)re_obj = re.compile(r'\d{3}') print(re_obj) result = re_obj.fullmatch('132') print(result) # <re.Match object; span=(0, 3), match='132'>
    • fullmatch - 判斷某個字符串是符合正則表達式描述的規則,如果不符合放回None,符號返回匹配對象

      result = fullmatch(re_obj, '243') print(result) # <re.Match object; span=(0, 3), match='243'>
    • match - 判斷字符串開頭是否符合正則表達式描述規則,如果不符合返回None,符合返回匹配對象

      re_obj = re.compile(r'\d{3}([\u4e00-\u9fa5]{,3})') result = re_obj.match('876解法二按附件欸-----------23') print(result, type(result)) # <re.Match object; span=(0, 3), match='876'> <class 're.Match'># 1) 匹配對象.group() - 獲取匹配結果 # 匹配對象.group(N) - 獲取正則表達式中第N個分組匹配到的結果 # 匹配對象.groups() - 獲取正則表達式中的[1,N]個分組匹配到的結果 print(result.group()) # 876解法二 print(result.group(1)) # 解法二 print(result.groups()) # ('解法二',)# 2) 匹配對象.span() - 獲取匹配結果在原字符串中的位置 print(result.span()) # (0, 6) [0, 6) print(result.span(1)) # (3, 6) [3, 5)# 3) 獲取原字符串 print(result.string) # 876解法二按附件欸-----------23
    • search - 獲取正則表達式中第一個滿足正則表達式的字串,如果沒有返回None,有返回匹配對象

      re_obj = re.compile(r'\d{3}') result = re_obj.search('faewf124fjau2affawe') print(result) # <re.Match object; span=(5, 8), match='124'>
    • findall - 獲取字符串中所有滿足正則表達式的子串,以列表的形式返回,列表中的元素是字符串

      result = re_obj.findall('123424341324baf24i42') print(result) # ['123', '424', '341', '324'] re_obj2 = re.compile(r'(\d{3}([a-z])([a-z]))') print(re_obj2.findall('123424341324baf24142afew243afefa32413b')) # [('324ba', 'b', 'a'), ('142af', 'a', 'f'), ('243af', 'a', 'f')]
    • finditer - 獲取字符串中所有滿足正則表達式的字串,以迭代器返回,迭代器中的元素是匹配對象

      iter1 = re_obj2.finditer('123424341324baf24142afew243afefa32413b') for obj in iter1:print(obj.group(), type(obj)) # <class 're.Match'>iter1 = re_obj2.finditer('123424341324baf24142afew243afefa32413b') print([obj.group() for obj in iter1]) # ['324ba', '142af', '243af']
    • split - 將字符串中所有滿足正則表達式的子串作為切割點對字符串進行切割

      re_obj = re.compile(r'[,。]') list1 = re_obj.split('解法二,發欸發ihi啊鵝。乏味,發紋阿爾法二啊覅i我i。', 2) print(list1) # ['解法二', '發欸發ihi啊鵝', '乏味,發紋阿爾法二啊覅i我i。']
    • sub - 將字符串中所有符合正則表達式的子串都替換成新字符串

      re_obj = re.compile(r'\d+') result = re_obj.sub('+', 'faeeg1324jfawe124fai324u24fa2343t24') print(result) # faeeg+jfawe+fai+u+fa+t+
  • 匹配參數

    • 單行匹配和多行匹配

      """ 默認多行匹配。 多行匹配的時候,不能和\n(換行)匹配 """re_obj = re.compile(r'a.b') print(re_obj.fullmatch('a\nb')) # None print(fullmatch(r'a.b', 'a\nb', flags=re.S)) # <re.Match object; span=(0, 3), match='a\nb'> print(fullmatch(r'(?s)a.b', 'a\nb')) # <re.Match object; span=(0, 3), match='a\nb'>
    • 忽略大小寫

      print(fullmatch(r'[a-z]+', 'AFAWafweFAWEIfaweFAErefIER', flags=re.I)) # <re.Match object; span=(0, 26), match='AFAWafweFAWEIfaweFAErefIER'>print(fullmatch(r'[a-z]+\n[A-Z]*', 'AFAWafweFA\nWEIfaweFAErefIER', flags=re.I|re.S)) # <re.Match object; span=(0, 27), match='AFAWafweFA\nWEIfaweFAErefIER'> print(fullmatch(r'(?is)[a-z]+\n[A-Z]*', 'AFAWafweFA\nWEIfaweFAErefIER')) # <re.Match object; span=(0, 27), match='AFAWafweFA\nWEIfaweFAErefIER'>

2. 面向對象

  • # 面向過程編程(窮人思想) - 邏輯+算法 # 函數式編程(小資思想) - 函數 # 面向對象編程(富豪思想) - 類和對象# 1. 類和對象 """ 什么是類: 具有相同功能和相同屬性的對象的集合。 - 抽象的概念 什么是對象:對象就是類的實例 """

作業

利用正則表達式完成下面的操作:

一、不定項選擇題

  • 能夠完全匹配字符串"(010)-62661617"和字符串"01062661617"的正則表達式包括( A,B,D)
  • A.r"\(?\d{3}\)?-?\d{8}"
    B. r"[0-9()-]+"
    C.r"[0-9(-)]*\d*"
    D.r"[(]?\d*[)-]*\d*"

  • 能夠完全匹配字符串“back”和“back-end”的正則表達式包括( A ,B,C,D )
    A. r“\w{4}-\w{3}|\w{4}”
    B. r“\w{4}|\w{4}-\w{3}”
    C.r “\S±\S+|\S+”
    D. r“\w*\b-\b\w*|\w*”

  • 能夠完全匹配字符串“go go”和“kitty kitty”,但不能完全匹配“go kitty”的正則表達式包括(A, D)
    A.r “\b(\w+)\b\s+\1\b”
    B. r“\w{2,5}\s*\1”
    C. r“(\S+) \s+\1”
    D. r“(\S{2,5})\s{1,}\1”

  • 能夠在字符串中匹配“aab”,而不能匹配“aaab”和“aaaab”的正則表達式包括(B,C )
    A. r“a*?b”
    B. r“a{,2}b”
    C. r“aa??b”
    D. r“aaa??b”

  • 二、編程題

    import re

    1.用戶名匹配

    要求: 1.用戶名只能包含數字 字母 下劃線2.不能以數字開頭 3.?度在 6 到 16 位范圍內
  • 密碼匹配

    要求: 1.不能包含!@#¥%^&*這些特殊符號2.必須以字母開頭 3.?度在 6 到 12 位范圍內
  • # 題1,題2class user:def __init__(self, name, pwd):self.name = nameself.pwd = pwddef check_name(self):re_name = r'[A-Za-z_][\dA-Za-z_]{5,15}'result = fullmatch(re_name, self.name)if result:return Truereturn Falsedef check_pwd(self):re_pwd = r'[A-Za-z][^!@#¥%^&*]{5,11}'result = fullmatch(re_pwd, self.pwd)if result:return Truereturn Falseuser1 = user('llfaweafeo', 'aeffaew2') if user1.check_name():print(f'{user1.name}通過') else:print(f'{user1.name}不通過')if user1.check_pwd():print(f'{user1.pwd}通過') else:print(f'{user1.pwd}不通過')
  • ipv4 格式的 ip 地址匹配
    提示: IP地址的范圍是 0.0.0.0 - 255.255.255.255
    提示:001.001.001.001 計算機也可以識別
  • def is_ipv4(in_str):def is_ipv4(in_str):# 25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\dreg = r'((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)'result = fullmatch(reg, in_str)if result:return Truereturn Falseipv4 = '133.13.12.56' if is_ipv4(ipv4):print(f'{ipv4}是ipv4') else:print(f'{ipv4}不是ipv4')
  • 提取用戶輸入數據中的數值 (數值包括正負數 還包括整數和小數在內) 并求和
  • 例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86 def get_sum(input_str):reg = r'(-?([1-9]\d*|0)[.]?\d*)'list1 = findall(reg, input_str)return sum([eval(x[0]) for x in list1])result = get_sum("-3.14good87nice19bye") print(result)
  • 驗證輸入內容只能是漢字
  • def is_chinese(in_str: str) -> bool:reg = r'[\u4e00-\u9fa5]*'result = fullmatch(reg, in_str)if result:return Truereturn Falsechinese_str = input('請輸入漢字字符串:') if is_chinese(chinese_str):print(f'{chinese_str} 全是漢字') else:print(f'{chinese_str} 不全是漢字')
  • 匹配整數或者小數(包括正數和負數)
  • def is_num(in_str: str) -> bool:reg = r'[-+]?([1-9]\d*|0)(\.\d*)?'result = fullmatch(reg, in_str)if result:return Truereturn Falsenum = input('請輸入一個數字:') if is_num(num):print(f'{num}是數字') else:print(f'{num}不是數字')
  • 驗證輸入用戶名和QQ號是否有效并給出對應的提示信息

    要求:
    用戶名必須由字母、數字或下劃線構成且長度在6~20個字符之間
    QQ號是5~12的數字且首位不能為0

  • class qquser:def __init__(self, nickname, qq):self.nickname = nicknameself.qq = qqdef validity(self):reg1 = r'\w{6,20}'reg2 = r'[1-9]\d{4,11}'res1 = fullmatch(reg1, self.nickname)res2 = fullmatch(reg2, self.qq)if res1:if res2:return True, ''else:return False, 'qq格式有誤!'return False, '用戶名格式有誤!'def __str__(self):return str({'name': self.nickname, 'qq': self.qq})qquser1 = qquser('12le2@ifaei', '12242463242') flag, msg = qquser1.validity() if flag:print(f'{qquser1}合法') else:print(f'{qquser1}不合法,{msg}')
  • 拆分長字符串:將一首詩的中的每一句話分別取出來

    poem = '窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。'
  • def poem_word(poem: str):reg = r'\b[,。;、:‘” ]'if search(r'[,。;、:‘” ]$', poem):list1 = split(reg, poem)return list1[:-1]else:list1 = split(reg, poem)return list1[:-1]poem = '窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。' list1 = poem_word(poem) print(list1)

    總結

    以上是生活随笔為你收集整理的day16-正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。