python正則表達式

這裏寫圖片描述

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']

反斜槓的困擾

  1. 表示\d可以用r”\d”代替”\\d”
  2. 表示\可以用r”\\”替代”\\\\”

re模塊-正則的七個方法

match(pat, orginStr[, flag])

m = re.match(pat, orginStr[, flag])
m.string

match方法解釋

  1. 從原始字符串第一個字符開始,匹配正則的規則
  2. 如果不是從第一個字符開始就匹配不到
  3. 參數1:正則表達式
  4. 參數2:原始的字符串
  5. 參數3:匹配模式(可選參數)

match方法返回值的屬性

  1. m.string: 匹配時使用的文本
  2. m.re: 匹配時使用的Pattern對象
  3. m.pos: 文本中正則表達式開始搜索的索引
  4. m.endpos: 文本中正則表達式結束搜索的索引
  5. m.lastindex: 最後一個被捕獲的分組在文本中的索引
  6. m.lastgroup: 最後一個被捕獲的分組的別名

match方法返回值的方法

  1. re.group(group1…):獲得一個或多個分組截獲的字符串;指定多個參數時將以元組形式返回,group1可以是編號,也可以是別名
  2. re.groups([default]):以元組的形式返回全部分組捕獲的字符串,如果沒有找到返回default設置的值,默認返回None
  3. groupdict([default]):返回以有別名的組的別名爲鍵、以該組截獲的子串爲值的字典,沒有別名的組不包含在內
  4. start([group]):返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引).group默認值爲0
  5. end([group]):返回指定的組截獲的子串在string中的結束索引(子串最後一個字符的索引+1).group默認值爲0
  6. span([group]):返回(start(group),end(group))
  7. expand(template):將匹配到的分組代入template中然後返回

compile

pat = re.compile("ab*?")    # 得到一個正則表達式的對象

compile(pat[,flag])

  1. 第一個參數是正則表達式
  2. 第二個參數是匹配模式

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")  --> \\d

escape方法詳解

  1. 用於將元字符串進行轉義後再返回
  2. 感覺沒有半點用

findall()

split()

sub()\subn()

purge():清空緩存中的正則表達式,等待驗證,有點坑

re.purge() --> 返回值是None

Pattern對象

pattern = re.compile("正則表達式")

Pattern對象的屬性

  1. pattern: 編譯時用的表達式字符串
  2. flags: 編譯時用的匹配模式,數字形式
  3. groups: 表達式中分組的數量
  4. groupindex: 以表達式中有別名的組的別名爲鍵、以該組對應的編號爲值的字典,沒有別名的組不包含在內

Pattern對象的方法

1. match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

  1. 從第一個字符開始匹配
  2. string是要匹配的字符串
  3. pos是起始匹配的位置
  4. endpos:終止匹配的位置
  5. 返回值是一個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)

### output ###
# p.pattern: (\w+) (\w+)(?P<sign>.*)
# p.flags: 16
# p.groups: 3
# p.groupindex: {'sign': 3}

2. search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

  1. 從字符整個字符串開始搜索匹配
  2. string是要匹配的字符串
  3. pos是起始匹配的位置
  4. endpos:終止匹配的位置
  5. 返回值是一個Match對象
search方法例子
# encoding: UTF-8 
import re 

# 將正則表達式編譯成Pattern對象 
pattern = re.compile(r'world') 

# 使用search()查找匹配的子串,不存在能匹配的子串時將返回None 
# 這個例子中使用match()無法成功匹配 
match = pattern.search('hello world!') 

if match: 
    # 使用Match獲得分組信息
    print match.group()

### 輸出 ###
# world

3. split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])

  1. 從字符整個字符串開始搜索匹配
  2. string:要匹配的字符串
  3. maxsplit:指定最大分割次數,不指定將全部分割
  4. 返回值是一個分割的列表
split方法例子
import re

p = re.compile(r'\d+')
list1 = p.split('one1two2three3four4')
print(list1)

### output ###
# ['one', 'two', 'three', 'four', '']

4. findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

  1. 從開頭到末尾匹配字符串
  2. string是要匹配的字符串
  3. pos是起始匹配的位置
  4. endpos:終止匹配的位置
  5. 返回一個找尋到的列表
findall
import re

p = re.compile(r'\d+')
list1 = p.findall('one1two2three3four4')
print(list1)

### output ###
# ['1', '2', '3', '4']

5. finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])

  1. 過濾出想要的數據,返回值是一個迭代器
finditer方法例子
import re

p =re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
    print m.group()

### output ###
# 1 2 3 4

6. sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])

  1. 利用repl字符串替換原有string字符串
  2. 第一個參數repl:要替換的字符串
  3. 第二個參數string:原始字符串
  4. 第三個參數count:count用於指定最多替換次數,不指定時全部替換
  5. 返回值:返回一個字符串
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)

### output ###
# say i, world hello!
# I Say, Hello World!

組與Match對象

常見的正則表達式

QQ表達式

"[1-9]\\d{4,10}"

QQ號規則

  1. 首先扣扣號開頭不能爲0;
  2. QQ號必須大於5且小於11(或12,13,QQ號最長位)

手機號表達式

# 平常手機號
"1[34578]\\d{9}"

# 手機號碼後5位相同
"1[34578]\\d{4}(\\d)\\1{4}"

手機號碼規則

  1. 手機號位數爲11位
  2. 開頭爲1,第二位爲3或4或5或7或8

郵箱表達式

"[\w\-\.]+\@(?:[\w\-]+\.)+[a-z]{2,3}"

郵箱規則

  1. @符號前面的可以爲字母,數字,下劃線,中劃線,或’.’
  2. @後面的可以是xxx.com、xxx.cn、xxx.com.cn

用戶名表達式

"[a-zA-z]\\w{0,9}"

用戶名規則

  1. 必須以字母開頭,長度在10位以內

密碼表達式

".{6,16}"

密碼規則

  1. 任意字符,6~16位
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章