Python 正則表達式

最近研究Python爬蟲,不少地方用到了正則表達式,可是沒好好研究,每次都得現查文檔。今天就專門看看Python正則表達式。本文參考了官方文檔 re模塊html

模式

首先正則表達式的語法我就不說了,這玩意卻是不算難,用的時候現查就好了——正則表達式_百度百科python

在不少編程語言中,因爲有轉義字符這麼一種東西的存在,致使正則表達式須要使用兩個斜槓來處理。若是編程語言支持原始字符串,那麼就不須要兩個斜槓了。在Python中,字符串前面添加字母r便可把字符串變成原始字符串。git

下面是一個正則表達式最簡單的使用例子。咱們查找全部以字母F開頭的單詞,不論大小寫。這個例子使用了正則表達式模塊的re.findall函數,它會返回全部符合模式的列表。正則表達式

import re

text = 'fuck shit it make she forest'

results = re.findall(r'\b[Ff]\w+', text)
print(results)

若是某一個模式須要常用,咱們能夠把它編譯爲模式對象。而後從模式對象上調用各類正則查詢方法。這樣作的優勢是:因爲模式已經編譯了,因此後續的查詢速度會更快。編程

pattern = re.compile(r'\b[Ff]\w+')
print(pattern.findall(text))

查詢標誌

大部分查詢方法還能夠接受一個查詢標誌參數。查詢標誌讓正則表達式具備不一樣的行爲。下面一一說明。緩存

標誌 做用
re.A、re.ASCII 以ASCII模式查詢,默認是Unicode模式
re.DEBUG 顯示編譯表達式的調試信息
re.I、re.IGNORECASE 忽略字母的大小寫
re.L、re.LOCALE 以區域敏感方式查詢匹配
re.M、re.MULTILINE 開啓多行模式,開啓以後行邊界符^$會匹配每行的開始和結束,而不是整個字符串的開始和結束
re.S、re.DOTALL 使用此標誌,會讓點符號匹配全部字符,默認狀況下點符號會匹配換行符之外的符號
re.X、re.VERBOSE 開啓囉嗦模式,能夠在寫正則表達式的時候添加註釋

下面是囉嗦模式的例子,來自Python官方文檔。編程語言

a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")

查詢方法

查詢方法有兩種形式,第一種是re模塊的函數,這些函數須要接受一個模式字符串。第二種就是從編譯好的模式對象上調用,這樣不須要模式字符串了。基本上大部分方法都有這兩種形式,因此這裏只須要介紹一種形式。函數

  • re.search(pattern, string, flags=0)方法查詢字符串,返回第一個結果的匹配對象。無論有多少個知足條件的字符串,這個方法之返回第一個。若是查詢不到,就返回None。this

  • re.match(pattern, string, flags=0)查詢字符串,當字符串的前面一部分和模式匹配的時候,會返回相應的匹配對象。若是不匹配,那麼返回None。須要注意即便開啓了多行模式,這個方法也只查詢字符串最前面的一部分,不會查詢每行的前面。url

  • re.fullmatch(pattern, string, flags=0),若是整個字符串和模式匹配,返回相應的匹配對象。不然返回None。

  • re.split(pattern, string, maxsplit=0, flags=0),按給定正則表達式分割字符串。

  • re.findall(pattern, string, flags=0),最經常使用的方法,返回一個列表,包含全部匹配模式的字符串。

  • re.finditer(pattern, string, flags=0),和findall方法相似,不過返回的是一個迭代器。

  • re.sub(pattern, repl, string, count=0, flags=0),將字符串中匹配模式的部分使用repl替換,返回替換後的字符串。

  • re.subn(pattern, repl, string, count=0, flags=0),和sub方法相似,不過返回元組(新字符串,替換的數量)

  • re.purge(),清除正則表達式緩存。

在已編譯好的正則表達式對象上還有如下幾個屬性。

  • flags,正則表達式的全部標誌,包括flags參數設置的,compile方法編譯傳入的,以及正則表達式中自己的標誌。

  • groups,正則表達式中捕獲組的數量。

  • pattern,返回模式字符串。

  • groupindex,返回(?P<id>)形式的命名組和組編號鍵值對組成的字典。

匹配對象

上面提到的不少方法都返回匹配對象。匹配對象包含了一些方法和屬性,方便咱們進行查詢。

最經常使用的就是group函數,它會返回指定組對應的字符串。下面的例子就查詢了給定數據中的數據量和每頁的條數。第0組返回整個匹配,第1組返回第一個匹配,以此類推……也能夠採用命名組的方式。

text = '總共20條數據 每頁5條'
pattern = re.compile(r'總共(?P<total>\d+)條數據\s+每頁(?P<per>\d+)條')

match = pattern.match(text)
print(match.group(0))

另外一個比較經常使用的函數就是groups(default=None),它返回全部組組成的元組。若是有的組沒有匹配到字符串,就會顯示爲None,這時候可使用default參數指定默認值。

text = '總共20條數據 每頁5條'
pattern = re.compile(r'總共(?P<total>\d+)條數據\s+每頁(?P<per>\d+)條')

match = pattern.match(text)

print(match.groups())

# 結果
# ('20', '5')

groupdict(default=None)返回組名和字符串組成的字典。仍是上面的例子。

print(match.groupdict())
# {'total': '20', 'per': '5'}

startend函數返回給定組的在字符串的起始和結束索引,若是對應的組沒有任何匹配,則返回-1。下面的例子來自Python官方文檔,從電子郵件地址中去除remove_this。

>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email[:m.start()] + email[m.end():]
'tony@tiger.net'

match.span([group])返回給定組的起始索引和結束索引組成的元組。

以上就是Python正則表達式的大部份內容了,靈活使用這些知識,能夠得到強大的功能。關於如何巧用,就看你們的智慧了。

相關文章
相關標籤/搜索