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. 類和對象 """ 什么是類: 具有相同功能和相同屬性的對象的集合。 - 抽象的概念 什么是對象:對象就是類的實例 """
作業
利用正則表達式完成下面的操作:
一、不定項選擇題
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 re1.用戶名匹配
要求: 1.用戶名只能包含數字 字母 下劃線2.不能以數字開頭 3.?度在 6 到 16 位范圍內密碼匹配
要求: 1.不能包含!@#¥%^&*這些特殊符號2.必須以字母開頭 3.?度在 6 到 12 位范圍內提示: IP地址的范圍是 0.0.0.0 - 255.255.255.255
提示:001.001.001.001 計算機也可以識別
驗證輸入用戶名和QQ號是否有效并給出對應的提示信息
要求:
用戶名必須由字母、數字或下劃線構成且長度在6~20個字符之間
QQ號是5~12的數字且首位不能為0
拆分長字符串:將一首詩的中的每一句話分別取出來
poem = '窗前明月光,疑是地上霜。舉頭望明月,低頭思故鄉。'總結
以上是生活随笔為你收集整理的day16-正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dbm与mysql_关于dBm与功率转换
- 下一篇: Jmeter Ant Jenkins报告