正則表達式的作用:用來匹配字元串 一、字元串方法字元串提供的方法是完全匹配,不能進行模糊匹配 s = 'hello world' # 字元串提供的方法是完全匹配,不能進行模糊匹配 print(s.find('ll')) # 2 查找ll的位置,輸出的是第一個l的位置 ret = s.replace(... ...
正則表達式的作用:用來匹配字元串
一、字元串方法
字元串提供的方法是完全匹配,不能進行模糊匹配
s = 'hello world' # 字元串提供的方法是完全匹配,不能進行模糊匹配 print(s.find('ll')) # 2 查找ll的位置,輸出的是第一個l的位置 ret = s.replace('ll', 'xx') # 替換,用ll 替換為 xx print(ret) # hexxo world print(s.split('w')) # ['hello ', 'orld'] 分割:以w為界限,分割為前後兩部分,存在列表中
二、正則表達式
正則的方法:
1、findall() :所有結果返回到一個列表裡
2、search() :返回匹配到的第一個對象,對象可以調用group()返回結果
3、match() :只在字元串開始匹配,也返回一個對象,可調用group()
findall() 方法:
1、正則表達式可以進行模糊匹配:
ret = re.findall(r'w\w{2}l', 'hello world') # 匹配字元串中w開頭l結尾中間有兩個字元的詞 # (加r,聲明是原生字元串,避免字元串轉義) print(ret) # ['worl']
2、元字元
- “.” 通配符:可以代指除換行符之外的所有字元,一個通配符只能代指任意一個字元
ret = re.findall('w..l', 'hello world') # 匹配字元串中w開頭l結尾中間有兩個字元的字元串 print(ret) # ['worl']
- “^” 上尖角號,只在字元串開始的位置匹配匹配
ret = re.findall('^h..o', 'hjklshllo') # 只在字元串的開始位置進行匹配,匹配不上就結束,不匹配後面的內容 print(ret) # [] ret = re.findall('^h..o', 'hjkoshllo') print(ret) # ['hjko']
- “$”符, 只在字元串結尾匹配
ret = re.findall('h..o$', 'hjkoshllo') print(ret) # ['hllo'] ret = re.findall('h..o$', 'hjkoshlyto') print(ret) # []
- “*”號,重覆匹配(*還可以代指0個) ,*代指的個數是0到無窮
ret = re.findall('h.*o', 'hjkoshlytg') # *表示重覆前面多個. 既只要是以h開頭o結尾的都行 print(ret) # ['hjko'] ret = re.findall('h*', 'hhhhjlhl') # 匹配多個h print(ret) # ['hhhh', '', '', 'h', '', ''] ret = re.findall('ah*', 'sdahhh') # 貪婪匹配,既按最多的匹配 print(ret) # ['ahhh'] ret = re.findall('ah*?', 'sdahhh') # 後加?變為惰性匹配,既按最少的匹配 print(ret) # ['a']
- “+”號,重覆匹配,同*,但是個數最少為1個,如果是0個匹配不了,範圍是1到無窮
ret = re.findall('ah+', 'asdahhhjlhl') # 匹配以ah開頭的內容 print(ret) # ['ahhh'] ret = re.findall('a+b', 'aaabsdbhbhabj') print(ret) # ['aaab', 'ab']
- “?”號,匹配的範圍是[0, 1]個
ret = re.findall('a?b', 'aaabsdhbhabj') # 匹配[0, 1]個a print(ret) # ['ab', 'b', 'ab']
- “{}”大括弧,自定義匹配的次數
ret = re.findall('a{2}b', 'aaabhaabhab') # 匹配2個a開頭,b結尾共3位的字元 print(ret) # ['aab', 'aab'] ret = re.findall('a{1,3}b', 'aaaabfaabhhab') # 匹配1-3個a,以b結尾的字元 # 註意:{1,3} 之間不能有空格,不能寫成{1, 3} print(ret) # ['aaab', 'aab', 'ab'] ret = re.findall('a{1, }b', 'aaaaaaaab') # {1,} 什麼都不加預設匹配的是正無窮 print(ret) # ['aaaaaaaab'] ret = re.findall('a{1,3}b', 'aaaab') # 匹配1-3個a,貪婪匹配原則,既預設按多的匹配 print(ret) # ['aaab']
3、字元集
取消元字元的特殊功能
- []
ret = re.findall('a[dc]b', 'adb') # 匹配既可以是adb也可以是acb,只能2選一,註意[]裡面不用逗號隔開 print(ret) # ['adb'] ret = re.findall('[a-z]', 'adb') # 表示一個範圍 print(ret) # 'a', 'd', 'b']
[]字元集還有取消元字元的特殊功能,(\ ^ -)例外:
ret = re.findall('[w,.]', 'awdb') # .此時不是元字元,無特殊意義,而是一個普通的字元 print(ret) # ['w'] ret = re.findall('[w,,]', 'awdb') print(ret) # ['w']
“^”放在[]裡面,表示取反:
ret = re.findall('[^w]', 'awdb') # 匹配除W以外的所有字元 print(ret) # ['a', 'd', 'b'] ret = re.findall('[^1,4]', 'a1wd42b') # 註:取反的是(1,4) 整體 print(ret) # ['a', 'w', 'd', '2', 'b']
4、\ 字元集
反斜杠後跟元字元去除特殊功能;反斜杠後跟普通字元實現特殊功能
"""
\d 匹配十進位數;相當於類[0-9]
\D 匹配任意非數字字元;相當於類[^0-9]
\s 匹配任意空白字元;相當於類[\t\n\r\f\v]
\S 匹配任何非空白字元;相當於類[^ \t\n\r\f\v]
\w 匹配任意字母數字字元;相當於類[a-zA-Z0-9]
\W 匹配任何人非字母數字字元;相當於類[^a-zA-Z0-9]
\b: 匹配一個特殊字元的邊界,就是單詞和空格間的位置
"""
ret = re.findall(r'\d{8}', 'qeqwe45454455qws1245') print(ret) # ['45454455'] 只能匹配到1組,因為後面數字的不夠8位 ret = re.findall(r'\d{8}', 'qeqwe45454455qws12456541') print(ret) # ['45454455', '12456541'] 匹配到2組, ret = re.findall(r'\D{4}', 'qeqwe4555qws41') # 大括弧裡面的數字4代表的是4個字元一組 print(ret) # ['qeqw'] ret = re.findall(r'\s', 'we4 g1') # 匹配空白符 print(ret) # [' '] ret = re.findall(r'\sw', 'ws4 wsg1') # 匹配空白符加w print(ret) # [' w'] ret = re.findall(r'\w', 'w4 g1') # 匹配空白符 print(ret) # ['w', '4', 'g', '1'] ret = re.findall(r'hello\b', 'hello, you is cat? ') # 匹配出你想要的且是一個單詞的內容 print(ret) # ['hello']
search() 方法: 匹配出第一個滿足條件的結果
ret = re.search('lo', 'hello, youlo? ') # 匹配出你想要的且是一個單詞的內容 print(ret) # <_sre.SRE_Match object; span=(3, 5), match='lo'> print(ret.group()) # lo ret = re.search('a.', 'asd') print(ret.group()) # as ret = re.search(r'a\.', 'asd') # 報錯,因為被索引字元串裡面沒有"."
print(ret.group()) # AttributeError: 'NoneType' object has no attribute 'group' ret = re.search(r'a\.', 'a.sd') print(ret.group()) # a. ret = re.search(r'a\+', 'a+sd') print(ret.group()) # a+
ret = re.search(r'\\c', r'asd\c') # \\不加r會報錯 print(ret.group()) # \c ret = re.search(r'\\', r'asd\c') # \\不加r會報錯 print(ret.group()) # \
註意:加r是告訴python解釋器,\\就是原生字元,不需要轉義,就直接把2個\送給re模塊
ret = re.search('\\\\', r'asd\c') # 等同於上面的語句, print(ret.group()) # \c
註意:因為在python解釋器裡面\也是有特殊意義的,所以當傳入4個\時,python解釋器通過轉義,變為2個\,然後傳給re模塊;在re模塊裡面,\同樣是有特殊意義,所以把2個\轉義為1個\,然後進行匹配
5、() :分組 |:或
ret = re.search('(as)+', r'asasd\c') # 匹配括弧裡面一個組的字元,而不是單個字元 print(ret.group()) # asas ret = re.findall(r'www.(\w+).com', 'www.123swd.com') # 涉及到組時,只會把組裡面的內容匹配出來 print(ret) # ['123swd'] ret = re.findall(r'www.(?:\w+).com', 'www.123swd.com') # 加問號冒號(?:)取消組的優先順序 print(ret) # ['www.123swd.com'] ret = re.search('(as)|', r'asd35') # 匹配括弧裡面一個組的字元,而不是單個字元 print(ret.group()) # as ret = re.search('(as)|3', r'asd35') # as或3,優先匹配第一個,誰在前輸出誰 print(ret.group()) # as ret = re.search('(as)|3', r'3as5e') print(ret.group()) # 3
三、稍複雜一點兒的正則
ret = re.search(r'(?P<id>\d{3})', 'asdsf124c4vss7').group('id') # 給匹配到的三個數字起一個名字,叫id;?<名字>是固定寫法 print(ret) # 124 # 後面匹配項只能是 '數字/數字或字母' 的形式,/前的一個字元一定不能為字母 ret = re.search(r'(?P<id>\d{3})/(?P<name>\w{3})', 'wa124/bug') print(ret.group()) # 124/bug print(ret.group('id')) # 124 print(ret.group('name')) # bug ret = re.match('asd', 'sdsasd') print(ret) # None ret = re.split('s', 'qwesdc') # 通過s對後面的字元串進行分割 print(ret) # ['qwe', 'dc'] ret = re.split('[eh]', 'qwesdhtrc') # 先通過e對後面的字元串進行分割,然後通過h對前面分割開的兩部分繼續分割 print(ret) # ['qw', 'sd', 'trc'] ret = re.split('[eh]', 'hqwesdhtrc') print(ret) # ['', 'qw', 'sd', 'trc'] 列表第一個元素為空,是因為字元串h前面沒有其他的字元 ret = re.sub('臭豬', '小baby', '雙雙是臭豬') # ('原內容', '新內容', '對象') print(ret) # 雙雙是小baby ret = re.subn('臭豬', '小baby', '雙雙是臭豬,小臭豬') # ('原內容', '新內容', '對象'),該方法會輸出替換的次數 print(ret) # ('雙雙是小baby,小小baby', 2) ret = re.sub('q..s', 's..z', 'zaqwesf') # ('原內容', '新內容', '操作對象') print(ret) # zas..zf ret = re.findall(r'\.com', 'adsdas.comasdaf') print(ret) # ['.com'] obj = re.compile(r'\.com') # 為了避免重覆,把規則編譯為一個對象,下次使用只需調用對象即可 ret = obj.findall('adsdas.comasdaf') # 等價於 re.findall(r'\.com', 'adsdas.comasdaf') print(ret) # ['.com'] ret = re.finditer(r'\d', 'a2da7f') # 把結果封裝為一個迭代器,既此時ret為一個迭代器 print(ret) # <callable_iterator object at 0x000001E3DDFF1320> print(next(ret)) # <_sre.SRE_Match object; span=(1, 2), match='2'> print(next(ret).group()) # 2