1. 程式人生 > >python 正則表達是常用語法理解

python 正則表達是常用語法理解

#coding=utf-8
#檔案操作
import os
#__file__代表的是當前檔案完整路徑
#os.path.dirname(__file__) 返回的是當前檔案所在目錄
dir_path=os.path.dirname(__file__)
file_path=os.path.join(dir_path,"xiaolu.html")
#print(file_path)



#爬蟲
#在python3.3裡面,用urllib.request代替urllib2
'''

import urllib2
file_html=urllib2.urlopen("https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E8%8A%9D%E9%BA%BB%E8%A1%97%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/22280165?fr=aladdin").read().decode("utf8")
print(file_html)
'''
import urllib.request
#獲取Html檔案
file_html=urllib.request.urlopen("https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E8%8A%9D%E9%BA%BB%E8%A1%97%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/22280165?fr=aladdin").read().decode("utf8")

import  re
#正則表示式的相關語法 http://www.runoob.com/python/python-reg-expressions.html
#print(re.match("www","www.baidu.com").span())
#span 表示從開始位置匹配



#re.match 嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
#re.match只能從字串的開始進行匹配,如果開始不能完成匹配,那麼函式就返回none
#str="Cats are smarter than dogs"
#object=re.match(r'(.*) are (.*?) .*',str,re.M|re.I)
#字串前面加上r代表對是字串不進行轉譯
#re.I  不區分大小寫 ;re.M 進行多行匹配 形象^和$符號的作用
# if(object):
    # print(object.group())#返回整個句子
    # print(object.group(1))#返回匹配的第一個括號內容
    # print(object.group(2))#返回匹配的第一個括號內容
# else:
    # print("no")
'''
在第二個括號加上問號的作用
如果加入問號,輸入的結果是
    Cats are smarter than dogs
    Cats
    smarter
如果不加問號,輸出的結果是
    Cats are smarter than dogs
    Cats
    smarter than

解析:re?代表的是非貪婪式匹配,所以加上?後,當匹配到第一個空格時就停止匹配,但是當沒有空格時,匹配到
最後一個空格才停止匹配
'''


#re.search 掃描整個字串並返回第一個成功的匹配。匹配成功re.search方法返回一個匹配的物件,否則返回None。
# object=re.search(r'(.*) are (.*?) .*',str)
# if(object):
    # print(object.group())
    # #group()函式不是返回的整個str,而是返回能匹配上的真個句子
    # print(object.group(1))
    # print(object.group(2))
# else:
    # print("no")

'''
re.match與re.search的區別
re.match只匹配字串的開始,如果字串開始不符合正則表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配。

'''

#
'''
Python 的 re 模組提供了re.sub用於替換字串中的匹配項。

語法:

re.sub(pattern, repl, string, count=0, flags=0)

引數:

    pattern : 正則中的模式字串。
    repl : 替換的字串,也可為一個函式。
    string : 要被查詢替換的原始字串。
    count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。
'''

# phone ="157-3517-0529 #這是小路的電話"
# num=re.sub(r'#.*$','',phone)
# print("小路的電話是:"+num)
# num=re.sub('\D','',num)
# #'\D'代表的是匹配非數字
# print("小路的電話是:"+num)


#repl 引數可以是一個函式
# def double(matched):
    # value=int(matched.group('value'))
    # #print(value)
    # return str(value*2)
# #之前str error,TypeError: 'str' object is not callable
# #因為在之前我定義了一個str字串,所以在呼叫str()函式進行轉換時,就出現該函式不能呼叫的錯誤
# s = 'A23G4HFD567'
# print(re.sub('(?P<value>\d+)', double, s))
#?P<value> 代表的是為group 分組新增一個分組名
#為group命令,全要在前面新增一個問號,如果問號沒有新增,就沒有命名成group
#至於有+號,是當匹配到多個數字字串時,將整個字串數字*2,不是將單個數字字元*2


#re.compile
'''
re.compile(pattern[, flags])

引數:

    pattern : 一個字串形式的正則表示式

    flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體引數為:
        re.I 忽略大小寫
        re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境
        re.M 多行模式
        re.S 即為 . 並且包括換行符在內的任意字元(. 不包括換行符)
        re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字元屬性資料庫
        re.X 為了增加可讀性,忽略空格和 # 後面的註釋

'''




# pattern=re.compile(r'\d+');
# m=pattern.match('one12twothree34four');
# print(m)

# m=pattern.match('one12twothree34four',3,10);
# print(m.group())
# print(m.start(0))#匹配的起始位置
# print(m.end(0))#匹配的結束位置
# print(m.span(0))#返回的是一個元組,包含匹配的開始位置和結束位置


#findall
'''
在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

語法格式為:

findall(string[, pos[, endpos]])

引數:

    string : 待匹配的字串。
    pos : 可選引數,指定字串的起始位置,預設為 0。
    endpos : 可選引數,指定字串的結束位置,預設為字串的長度。
'''

# pattern=re.compile(r'\d+')
# result1=pattern.findall('runoob 123 google 456')
# result2=pattern.findall('run88oob123google456')
# print(result1)
# print(result2)


#re.finditer
'''

Python 基礎教程
Python 基礎教程
Python 簡介
Python 環境搭建
Python 中文編碼
Python 基礎語法
Python 變數型別
Python 運算子
Python 條件語句
Python 迴圈語句
Python While 迴圈語句
Python for 迴圈語句
Python 迴圈巢狀
Python break 語句
Python continue 語句
Python pass 語句
Python Number(數字)
Python 字串
Python 列表(List)
Python 元組
Python 字典(Dictionary)
Python 日期和時間
Python 函式
Python 模組
Python 檔案I/O
Python File 方法
Python 異常處理
Python OS 檔案/目錄方法
Python 內建函式

Python 高階教程
Python 面向物件
Python 正則表示式
Python CGI程式設計
Python MySQL
Python 網路程式設計
Python SMTP
Python 多執行緒
Python XML解析
Python GUI 程式設計(Tkinter)
Python2.x與3​​.x版本區別
Python IDE
Python JSON
Python 100例
Python 面向物件
Python CGI程式設計
Python 正則表示式

正則表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式匹配。

Python 自1.5版本起增加了re 模組,它提供 Perl 風格的正則表示式模式。

re 模組使 Python 語言擁有全部的正則表示式功能。

compile 函式根據一個模式字串和可選的標誌引數生成一個正則表示式物件。該物件擁有一系列方法用於正則表示式匹配和替換。

re 模組也提供了與這些方法功能完全一致的函式,這些函式使用一個模式字串做為它們的第一個引數。

本章節主要介紹Python中常用的正則表示式處理函式。
re.match函式

re.match 嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。

函式語法:

re.match(pattern, string, flags=0)

函式引數說明:
引數    描述
pattern    匹配的正則表示式
string    要匹配的字串。
flags    標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表示式修飾符 - 可選標誌

匹配成功re.match方法返回一個匹配的物件,否則返回None。

我們可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
匹配物件方法    描述
group(num=0)    匹配的整個表示式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups()    返回一個包含所有小組字串的元組,從 1 到 所含的小組號。
例項
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

以上例項執行輸出結果為:

(0, 3)
None

例項
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs"
 
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

以上例項執行結果如下:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search方法

re.search 掃描整個字串並返回第一個成功的匹配。

函式語法:

re.search(pattern, string, flags=0)

函式引數說明:
引數    描述
pattern    匹配的正則表示式
string    要匹配的字串。
flags    標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。

匹配成功re.search方法返回一個匹配的物件,否則返回None。

我們可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式。
匹配物件方法    描述
group(num=0)    匹配的整個表示式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups()    返回一個包含所有小組字串的元組,從 1 到 所含的小組號。
例項
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配

以上例項執行輸出結果為:

(0, 3)
(11, 14)

例項
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
以上例項執行結果如下:

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match與re.search的區別

re.match只匹配字串的開始,如果字串開始不符合正則表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配。
例項
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
 
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
以上例項執行結果如下:

No match!!
search --> matchObj.group() :  dogs

檢索和替換

Python 的 re 模組提供了re.sub用於替換字串中的匹配項。

語法:

re.sub(pattern, repl, string, count=0, flags=0)

引數:

    pattern : 正則中的模式字串。
    repl : 替換的字串,也可為一個函式。
    string : 要被查詢替換的原始字串。
    count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。

例項
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
phone = "2004-959-559 # 這是一個國外電話號碼"
 
# 刪除字串中的 Python註釋
num = re.sub(r'#.*$', "", phone)
print "電話號碼是: ", num
 
# 刪除非數字(-)的字串
num = re.sub(r'\D', "", phone)
print "電話號碼是 : ", num
以上例項執行結果如下:

電話號碼是:  2004-959-559
電話號碼是 :  2004959559

repl 引數是一個函式

以下例項中將字串中的匹配的數字乘以 2:
例項
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
# 將匹配的數字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)
 
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

執行輸出結果為:

A46G8HFD1134

re.compile 函式

compile 函式用於編譯正則表示式,生成一個正則表示式( Pattern )物件,供 match() 和 search() 這兩個函式使用。

語法格式為:

re.compile(pattern[, flags])

引數:

    pattern : 一個字串形式的正則表示式

    flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體引數為:
        re.I 忽略大小寫
        re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境
        re.M 多行模式
        re.S 即為 . 並且包括換行符在內的任意字元(. 不包括換行符)
        re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字元屬性資料庫
        re.X 為了增加可讀性,忽略空格和 # 後面的註釋

例項
例項
>>>import re
>>> pattern = re.compile(r'\d+')                    # 用於匹配至少一個數字
>>> m = pattern.match('one12twothree34four')        # 查詢頭部,沒有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開始匹配,沒有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配
>>> print m                                         # 返回一個 Match 物件
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)   # 可省略 0
'12'
>>> m.start(0)   # 可省略 0
3
>>> m.end(0)     # 可省略 0
5
>>> m.span(0)    # 可省略 0
(3, 5)

在上面,當匹配成功時返回一個 Match 物件,其中:

    group([group1, …]) 方法用於獲得一個或多個分組匹配的字串,當要獲得整個匹配的子串時,可直接使用 group() 或 group(0);
    start([group]) 方法用於獲取分組匹配的子串在整個字串中的起始位置(子串第一個字元的索引),引數預設值為 0;
    end([group]) 方法用於獲取分組匹配的子串在整個字串中的結束位置(子串最後一個字元的索引+1),引數預設值為 0;
    span([group]) 方法返回 (start(group), end(group))。

再看看一個例子:
例項
>>>import re
>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小寫
>>> m = pattern.match('Hello World Wide Web')
>>> print m                               # 匹配成功,返回一個 Match 物件
<_sre.SRE_Match object at 0x10bea83e8>
>>> m.group(0)                            # 返回匹配成功的整個子串
'Hello World'
>>> m.span(0)                             # 返回匹配成功的整個子串的索引
(0, 11)
>>> m.group(1)                            # 返回第一個分組匹配成功的子串
'Hello'
>>> m.span(1)                             # 返回第一個分組匹配成功的子串的索引
(0, 5)
>>> m.group(2)                            # 返回第二個分組匹配成功的子串
'World'
>>> m.span(2)                             # 返回第二個分組匹配成功的子串
(6, 11)
>>> m.groups()                            # 等價於 (m.group(1), m.group(2), ...)
('Hello', 'World')
>>> m.group(3)                            # 不存在第三個分組
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group
findall

在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

語法格式為:

findall(string[, pos[, endpos]])

引數:

    string : 待匹配的字串。
    pos : 可選引數,指定字串的起始位置,預設為 0。
    endpos : 可選引數,指定字串的結束位置,預設為字串的長度。

查詢字串中的所有數字:
例項
# -*- coding:UTF8 -*-
 
import re
 
pattern = re.compile(r'\d+')   # 查詢數字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)

輸出結果:

['123', '456']
['88', '12']

re.finditer

和 findall 類似,在字串中找到正則表示式所匹配的所有子串,並把它們作為一個迭代器返回。

re.finditer(pattern, string, flags=0)

引數:
引數    描述
pattern    匹配的正則表示式
string    要匹配的字串。
flags    標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表示式修飾符 - 可選標誌
'''

# it =re.finditer(r'\d+',"12a32bc43jf3")
# print(it)
# for match in it:
    # print(match.group())
# #it b本質上返回的是一個\d+匹配成功的物件陣列。該物件可以通過group返回匹配的內容


#re.spilt
'''
split 方法按照能夠匹配的子串將字串分割後返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

引數:
引數    描述
pattern    匹配的正則表示式
string    要匹配的字串。
maxsplit    分隔次數,maxsplit=1 分隔一次,預設為 0,不限制次數。
flags    標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表示式修飾符 - 可選標誌
'''

str=re.split('\W+','runoob, runoob, runoob.')
print(str)

str=re.split('(\W+)','runoob, runoob, runoob.')
print(str)
#(re) 代表的是括號內的表示式也成為一個組