1、知識點導圖
1、正則表達式簡單介紹及意義
2、正則表達式的基本語法
3、正則表達式的七種武器
4、正則表達式的常見語法
2、正則表達式的意義
什麼是正則表達式
正則表達式並不是Python的一部分。正則表達式是用於處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得
益於這一點,在提供了正則表達式的語言裏,正則表達式的語法都是一樣的,區別只在於不同的編
程語言實現支持的語法數量不同;但不用擔心,不被支持的語法通常是不常用的部分。如果已
經在其他語言裏使用過正則表達式,只需要簡單看一看就可以上手了。
Python的正則表達式的模塊是 ‘re’,它的基本語法規則就是指定一個字符序列
正則表達式的大致匹配過程
依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹成功;一旦有匹配不
成功的字符則匹配失敗。如果表達式中有量詞或邊界,這個過程會稍微有一些不同,但也是很
好理解的,看下圖中的示例以及自己多使用幾次就能明白。
3、正則表達式的基本語法
1、 字符
字符 |
功能 |
一般字符 |
匹配自己 |
\ |
轉義字符 |
[] |
字符集,對應的位置可以使字符集裏的任意字符或範圍,使用特殊符號需要進行轉義 |
[^] |
表示匹配非^後邊內容 [^abc]表示匹配非abc的內容 |
| |
將兩個規則並列起來,以‘|’連接,表示只要滿足其中之一就可以匹配 |
| |
注意 |匹配兩邊整條規則,加特技需要‘(?: )’包起來,如:I have a (?:dog |
2、預定義字符集(可以寫在字符集中)
字符 |
功能 |
. |
匹配除\n外所有字符,加特技需要加S,就可以包括\n了(r‘.+’ , str , re.S) |
\d |
數字[0-9] |
\D |
非數字[^\d] |
\s |
間隔字符[<空格>\t\r\n\f\v] |
\S |
非空白間隔字符[^\s] |
\w |
單詞字符[a-zA-Z] |
\W |
非單詞字符[^\w] |
3、數量詞
字符 |
功能 |
* |
匹配前一個字符0次或者無限次 a* |
+ |
匹配前一個字符1次或者無限次a+ |
? |
匹配前一個字符0次或者1次a? |
{m} |
匹配前一個字符m次 a{m} |
{m-n} |
匹配前一個字符m到n次 a{m-n},最少m次需要{m,} |
數量詞? |
使匹配以非貪婪模式下進行 a*?、a+? |
4、邊界匹配(不消耗待匹配的字符串中的字符)
字符 |
功能 |
^ |
匹配字符串開頭,多行模式下匹配每一行開頭^abc |
|匹配字符串的結尾,多行模式下匹配每一行結尾abc
\A|僅匹配字符串的開頭 \Aabc
\Z|僅匹配字符串的結尾 abc\Z
\b |匹配\w和\W之間的
\B|[^/b]
5、邏輯、分組
字符 |
功能 |
| |
左右表達式任意匹配一個,默認左邊開始 |
(….) |
分組,從表達式左邊起,遇到的第一個爲1,依次加1 |
(?P…) |
分組除了原名外,增加別名name (?Pabc){2} =abcabc |
\ |
引用分組編號爲number的組匹配的字符(\d)abc\1 = 1abc1 |
(?P = name) |
引用別名爲name的分組匹配的字符串 |
貪婪模式的例子
pat = re.compile("ab*")
str1 = pat.findall("abbbbbbbbb")
print(str1)
['abbbbbbbbb']
非貪婪模式的例子
pat = re.compile("ab*?")
str1 = pat.findall("abbbbbbbbb")
print(str1)
['a']
反斜槓的困擾
- 表示\d可以用r”\d”代替”\\d”
- 表示\可以用r”\\”替代”\\\\”
re模塊-正則的七個方法
match(pat, orginStr[, flag])
m = re.match(pat, orginStr[, flag])
m.string
match方法解釋
- 從原始字符串第一個字符開始,匹配正則的規則
- 如果不是從第一個字符開始就匹配不到
- 參數1:正則表達式
- 參數2:原始的字符串
- 參數3:匹配模式(可選參數)
match方法返回值的屬性
- m.string: 匹配時使用的文本
- m.re: 匹配時使用的Pattern對象
- m.pos: 文本中正則表達式開始搜索的索引
- m.endpos: 文本中正則表達式結束搜索的索引
- m.lastindex: 最後一個被捕獲的分組在文本中的索引
- m.lastgroup: 最後一個被捕獲的分組的別名
match方法返回值的方法
- re.group(group1…):獲得一個或多個分組截獲的字符串;指定多個參數時將以元組形式返回,group1可以是編號,也可以是別名
- re.groups([default]):以元組的形式返回全部分組捕獲的字符串,如果沒有找到返回default設置的值,默認返回None
- groupdict([default]):返回以有別名的組的別名爲鍵、以該組截獲的子串爲值的字典,沒有別名的組不包含在內
- start([group]):返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引).group默認值爲0
- end([group]):返回指定的組截獲的子串在string中的結束索引(子串最後一個字符的索引+1).group默認值爲0
- span([group]):返回(start(group),end(group))
- expand(template):將匹配到的分組代入template中然後返回
search()
compile
pat = re.compile("ab*?") # 得到一個正則表達式的對象
compile(pat[,flag])
- 第一個參數是正則表達式
- 第二個參數是匹配模式
compile匹配模式
模式 |
詳解 |
re.I/re.IGNORECASE |
忽略大小寫 |
re.M/re.MULTILINE |
多行模式,改變’^’和’$’的行爲 |
re.S(re.DOTALL) |
點任意匹配模式,改變’.’的行爲 |
re.L(re.LOCALE) |
使預定字符類 \w \W \b \B \s \S 取決於當前區域設定 |
re.U(re.UNICODE) |
使預定字符類 \w \W \b \B \s \S \d \D |
re.X(re.VERBOSE) |
詳細模式,可以是多行,忽略空白字符,可以加入註釋 |
escape(str)
re.escape("\d")
escape方法詳解
- 用於將元字符串進行轉義後再返回
- 感覺沒有半點用
findall()
split()
sub()\subn()
purge():清空緩存中的正則表達式,等待驗證,有點坑
. -->
Pattern對象
pattern = re.compile("正則表達式")
Pattern對象的屬性
- pattern: 編譯時用的表達式字符串
- flags: 編譯時用的匹配模式,數字形式
- groups: 表達式中分組的數量
- groupindex: 以表達式中有別名的組的別名爲鍵、以該組對應的編號爲值的字典,沒有別名的組不包含在內
Pattern對象的方法
1. match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])
- 從第一個字符開始匹配
- string是要匹配的字符串
- pos是起始匹配的位置
- endpos:終止匹配的位置
- 返回值是一個Match對象
match方法例子
import re
p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
print("p.pattern:", p.pattern)
print("p.flags:", p.flags)
print("p.groups:", p.groups)
print("p.groupindex:", p.groupindex)
2. search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])
- 從字符整個字符串開始搜索匹配
- string是要匹配的字符串
- pos是起始匹配的位置
- endpos:終止匹配的位置
- 返回值是一個Match對象
search方法例子
import re
pattern = re.compile(r'world')
match = pattern.search('hello world!')
if match:
print match.group()
3. split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])
- 從字符整個字符串開始搜索匹配
- string:要匹配的字符串
- maxsplit:指定最大分割次數,不指定將全部分割
- 返回值是一個分割的列表
split方法例子
import re
p = re.compile(r'\d+')
list1 = p.split('one1two2three3four4')
print(list1)
4. findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
- 從開頭到末尾匹配字符串
- string是要匹配的字符串
- pos是起始匹配的位置
- endpos:終止匹配的位置
- 返回一個找尋到的列表
findall
import re
p = re.compile(r'\d+')
list1 = p.findall('one1two2three3four4')
print(list1)
5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])
- 過濾出想要的數據,返回值是一個迭代器
finditer方法例子
import re
p =re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
print m.group()
6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])
- 利用repl字符串替換原有string字符串
- 第一個參數repl:要替換的字符串
- 第二個參數string:原始字符串
- 第三個參數count:count用於指定最多替換次數,不指定時全部替換
- 返回值:返回一個字符串
sub方法
import re
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
print p.sub(r'\2 \1', s)
def func(m):
return m.group(1).title() + ' ' + m.group(2).title()
print p.sub(func, s)
組與Match對象
常見的正則表達式
QQ表達式
"[1-9]\\d{4,10}"
QQ號規則
- 首先扣扣號開頭不能爲0;
- QQ號必須大於5且小於11(或12,13,QQ號最長位)
手機號表達式
# 平常手機號
"1[34578]\\d{9}"
# 手機號碼後5位相同
"1[34578]\\d{4}(\\d)\\1{4}"
手機號碼規則
- 手機號位數爲11位
- 開頭爲1,第二位爲3或4或5或7或8
郵箱表達式
"[\w\-\.]+\@(?:[\w\-]+\.)+[a-z]{2,3}"
郵箱規則
- @符號前面的可以爲字母,數字,下劃線,中劃線,或’.’
- @後面的可以是xxx.com、xxx.cn、xxx.com.cn
用戶名表達式
"[a-zA-z]\\w{0,9}"
用戶名規則
- 必須以字母開頭,長度在10位以內
密碼表達式
".{6,16}"
密碼規則
- 任意字符,6~16位