python学习笔记(十一)——正则表达式
生活随笔
收集整理的這篇文章主要介紹了
python学习笔记(十一)——正则表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獨有的工具:用來匹配或者提取字符串。
不屬于Python基礎。屬于編程基礎。
需要導入re模塊import re
文章目錄
- 1、findall方法
- 2、match方法
- 3、search方法
- *補充
- 4、元字符
- 4.1、單字符匹配
- 4.2、代表數量的元字符
- 4.3、代表邊界的元字符
- 4.4、分組匹配
- 補充
- 5、貪婪和非貪婪
1、findall方法
在字符串中找到正則表達式所匹配的所有子串,并返回一個列表。如果沒有找到匹配的,則返回空列表.
示例:
str1 = '人生若只如初見,何事秋風悲畫扇' print(re.findall('只如初見',str1)) #精準匹配 指明道姓 print(re.findall('人之初',str1)) 執行結果: ['只如初見'] []2、match方法
re.match 嘗試從字符串的起始位置匹配一個模式,匹配成功 返回的是一個匹配對象(這個對象包含了我們匹配的信息)。如果不是起始位置匹配成功的話,match()返回的是None.
注意:match只能匹配到一個
import restr2 = 'python123python666' result = re.match('python',str2) #精準匹配 指明道姓 print(result)執行結果: <_sre.SRE_Match object; span=(0, 6), match='python'>3、search方法
re.search 掃描整個字符串,匹配成功 返回的是一個匹配對象(這個對象包含了我們匹配的信息)。
注意:search也只能匹配到一個,找到符合規則的就返回,不會再繼續往后找。
import re a = "python123123java" print(re.search('python',a))# yes print(re.search('cc',a))# None執行結果: <_sre.SRE_Match object; span=(0, 6), match='python'> Nonere.match與re.search的區別:
①re.match從字符串的開始位置匹配 如果字符串一開始就不符合規,則匹配失敗返回None。
②re.search匹配整個字符串,如果一直找不到,返回None
③都只返回一個符合條件的
注意:re.findall 會找到所有符合規則的字符串
*補充
group:提取匹配到的內容
span:提取到匹配到的字符串的下標
示例:
str2 = 'python123python666' result = re.match('python',str2) print(result) #group:提取匹配到的內容 a = result.group() print(a) #span:提取到匹配到的字符串的下標 b = result.span() print(b)執行結果: <_sre.SRE_Match object; span=(0, 6), match='python'> python (0, 6)4、元字符
4.1、單字符匹配
| . | 匹配任意1個字符(除了\n) |
| [] | 匹配 [] 中列舉的字符 |
| \d | 匹配數字,即0-9 |
| \D | 匹配非數字,即不是數字 |
| \s | 匹配空白,即 空格,tab鍵 |
| \S | 匹配非空白 |
| \w | 匹配單詞符,即a-z、A-Z、0-9、_ |
| \W | 匹配非單詞字符 |
示例:
import re # . 代表任意一個字符 str1 ='高堂明鏡悲白發,朝如青絲暮成雪' print(re.findall('高堂明鏡...', str1)) #['高堂明鏡悲白發']# [] 字符組 匹配[]中列舉的字符組 str1 ='高1堂明a鏡2悲白ea發3,朝如青s46絲暮成8' print(re.findall('[8]', str1)) #[] print(re.findall('[0-9]', str1)) #[] print(re.findall('[a-z]', str1)) #[] str1 = 'abba abbd abbe abe abbs adc' print(re.findall('abb[abe]',str1)) #整個中括號只代表一個字符 #['abba', 'abbe']# \d 匹配數字 即0-9 str1 = 'abc123efg456g@' result = re.findall(r'\d',str1) print(result) #['1', '2', '3', '4', '5', '6'] result = re.findall(r'\d{3}',str1) print(result) #['123', '456']# \D 匹配非數字 str1 = 'abc123efg456gk@wc' result = re.findall(r'\D',str1) print(result) #['a', 'b', 'c', 'e', 'f', 'g', 'g', 'k', '@', 'w', 'c'] result = re.findall(r'\D{3}',str1) print(result) #['abc', 'efg', 'gk@'] result = re.findall(r'\D{2,4}',str1) print(result) #['abc', 'efg', 'gk@w']# \s 匹配空格 str1 = 'hello you are welcome!' result = re.findall(r'\s',str1) print(result) #[' ', ' ', ' ']# \S 匹配非空格 str1 = 'hello you are welcome!' result = re.findall(r'\S',str1) print(result) #['h', 'e', 'l', 'l', 'o', 'y', 'o', 'u', 'a', 'r', 'e', 'w', 'e', 'l', 'c', 'o', 'm', 'e', '!'] result = re.findall(r'\S{2,4}',str1) #注意看結果 print(result) #['hell', 'you', 'are', 'welc', 'ome!']# \w 匹配單詞字符和數字 0-9 a-z A-Z str1 = '@$123hello456&%' result = re.findall(r'\w',str1) print(result) #['1', '2', '3', 'h', 'e', 'l', 'l', 'o', '4', '5', '6']# \W 匹配非單詞字符和數字 str1 = '@$123hello456&%' result = re.findall(r'\W',str1) print(result) #['@', '$', '&', '%']4.2、代表數量的元字符
| * | 匹配前一個字符出現0次或者無限次,即可有可無 |
| + | 匹配前一個字符出現1次或者無限次,即至少有1次 |
| ? | 匹配前一個字符出現0次或者1次,即要么有1次,要么沒有 |
| {m} | 匹配前一個字符出現m次 |
| {m,} | 匹配前一個字符至少出現m次 |
| {m,n} | 匹配前一個字符出現從m到n次 |
示例:
import re # * 匹配前一個字符出現0次或無限次 即可有可無 # + 匹配前一個字符出現1次或無限次 即至少有1次 # ? 匹配前一個字符出現0次或1次 即要么0次要么1次 str1 = 'abbbc' result = re.findall('ab*c',str1) print(result) #['abbbc'] result = re.findall('ab+c',str1) print(result) #['abbbc'] result = re.findall('ab?c',str1) print(result) #[]# {} 控制次數 控制前一個字符出現的次數 可以直接寫次數 數字代表數量 str1 = 'abbbbbbc' result = re.findall('ab{6}c',str1) print(result) #['abbbbbbc'] result = re.findall('ab{2,6}c',str1) #可以寫區間 左閉右閉 print(result) #['abbbbbbc'] result = re.findall('ab{,6}c',str1) #起始位置不寫 是從0開始 print(result) #['abbbbbbc'] result = re.findall('ab{2,}c',str1) #終止位置不寫 可到正無窮 print(result) #['abbbbbbc']4.3、代表邊界的元字符
| ^ | 匹配字符串開頭 |
| $ | 匹配字符串結尾 |
| \b | 匹配一個單詞的邊界 |
示例:
import re #錨點元字符 ^ 字符串首 $ 字符串尾 str1 ='高堂明鏡悲白發,朝如青絲暮成雪' result = re.findall('^悲白發',str1) #只匹配以該字符串開始的 print(result) #[] result = re.findall('暮成雪$',str1) #只匹配以該字符串結尾的 print(result) #['暮成雪']# \b 單詞邊界 str1 = 'hello world niyehello haha hellowe' result = re.findall(r'\bhello\b',str1) print(result) #['hello']4.4、分組匹配
| | | 匹配左右任意一個表達式 |
| (ab) | 將括號中的字符作為一個分組 |
示例:
import re # | 選擇元字符 str1 = 'a+bhelloa-bhello' result = re.findall(r'a\+b|a-b',str1) #\+表示轉義字符 + print(result) #['a+b', 'a-b']# () 將括號中字符作為一個分組 只提取括號當中的內容 html = '<a>音樂</a><a>日語</a><a>韓語</a>' result = re.findall(r'<a>(.*)</a>', html) # 貪婪匹配 print(result) #['音樂</a><a>日語</a><a>韓語'] result = re.findall(r'<a>(.*?)</a>', html) # 非貪婪匹配 print(result) #['音樂', '日語', '韓語']補充
| a| b | 匹配a或b |
| (re) | 對正則表達式分組并記住匹配的文本 |
| (?ix) | 正則表達式包含兩種可選標志:i 或 x 。只影響括號中的區域。 |
| (?-ix) | 正則表達式關閉 i 或 x 可選標志。只影響括號中的區域。 |
| \A | 匹配字符串開始 |
| \Z | 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。 |
| \z | 匹配字符串結束 |
| \G | 匹配最后匹配完成的位置。 |
| \b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
| \B | 匹配非單詞邊界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
| \n, \t, 等. | 匹配一個換行符。匹配一個制表符。等 |
| \1…\9 | 匹配第n個分組的內容。 |
| \10 | 匹配第n個分組的內容,如果它經匹配。否則指的是八進制字符碼的表達式。 |
5、貪婪和非貪婪
正則默認都是用貪婪模式去匹配數據的,就是盡可能多的匹配符合要求的數據。
在非貪婪模式下,始終找最短匹配。
示例:
import re b = '<html>000</html><td>ddd</td>' print(re.findall(r'<.*>',b))# 貪婪 #['<html>000</html><td>ddd</td>'] print(re.findall(r'<.*?>',b))# 加上?變成非貪婪 #['<html>', '</html>', '<td>', '</td>'] print(re.findall(r'-(\d+)(.+-)','-123456789-')) #[('12345678', '9-')] print(re.findall(r'-(\d+?)(.+-)','-123456789-')) #[('1', '23456789-')]總結
以上是生活随笔為你收集整理的python学习笔记(十一)——正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQLite单例模式(QT4)
- 下一篇: 学习笔记(十二)——虚拟机安装和pych