Python基礎六:Python 正則表達式

Python 正則表達式

正則表達式 (Regular Expression) 又稱 RegEx, 是用來匹配字符的一種工具. 在一大串字符中尋找你需要的內容. 它常被用在很多方面, 比如網頁爬蟲, 文稿整理, 數據篩選等等.

比如我需要爬取網頁中每一頁的標題. 而網頁中的標題常常是這種形式:

<title>我是標題</ title>

而且每個網頁的標題各不相同, 我就能使用正則表達式, 用一種簡單的匹配方法, 一次性選取出成千上萬網頁的標題信息.

正則表達式無非就是在做這麼一回事. 在文字中找到特定的內容, 比如下面的內容.我們在 “dog runs to cat” 這句話中尋找是否存在 “cat” 或者 “bird”,先使用成員運算符方式進行匹配,若要使用正則表達式, 首先需要調用一個 python 的內置模塊 re,可以看出, 如果 re.search() 找到了結果, 它會返回一個match 的 object. 如果沒有匹配到, 它會返回 None.

import  re
pattern1='cat'
pattern2='bird'
string='dog runs to cat.'
#成員運算符方式匹配
print(pattern1 in string)
print(pattern2 in string)
#正則表達式匹配
print(re.search(pattern1,string))
print(re.search(pattern2,string))

運行結果:

True
False
<_sre.SRE_Match object; span=(12, 15), match='cat'>

None

除了上面的簡單匹配, 下面的內容纔是正則的核心內容, 使用特殊的 pattern 來靈活匹配需要找的文字.如果需要找到潛在的多個可能性文字, 我們可以使用 [] 將可能的字符囊括進來. 比如 [ab] 就說明我想要找的字符可以是 a 也可以是 b,不能是ab. 這裏我們還需要注意的是, 建立一個正則的規則, 我們在 pattern 的 “” 前面需要加上一個 r 用來表示這是正則表達式, 而不是普通字符串. 通過下面這種形式, 如果字符串中出現 “run” 或者是“ran”, 它都能找到.

import  re

x=r'r[ua]n'
print(re.search(x,string))

運行結果:

<_sre.SRE_Match object; span=(4, 7), match='run'>

同樣, 中括號 [] 中還可以是以下這些或者是這些的組合. 比如 [A-Z] 表示的就是所有大寫的英文字母. [0-9a-z] 表示可以是數字也可以是任何小寫字母.

import  re
print(re.search(r"r[A-Z]n", "dog runs to cat")) # None
print(re.search(r"r[a-z]n", "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 7),match='run'>
print(re.search(r"r[0-9]n", "dog r2ns to cat")) # <_sre.SRE_Match object; span=(4, 7),match='r2n'>
print(re.search(r"r[0-9a-z]n", "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 7),match='run'>

執行結果:

None
<_sre.SRE_Match object; span=(4, 7), match='run'>
<_sre.SRE_Match object; span=(4, 7), match='r2n'>

<_sre.SRE_Match object; span=(4, 7), match='run'>

除了自己定義規則, 還有很多匹配的規則時提前就給你定義好了的. 下面有一些特殊的匹配類型給大家先總結一下, 然後再上一些例子.

\d : 任何數字

\D : 不是數字

\s : 任何 white space, 如 [\t\n\r\f\v]

\S : 不是 white space

\w : 任何大小寫字母, 數字和 “”    [a-zA-Z0-9]

\W : 不是 \w

\b : 空白字符 (只在某個字的開頭或結尾)

\B : 空白字符 (不在某個字的開頭或結尾)

\\ : 匹配 \

. : 匹配任何字符 (除了 \n)

^ : 匹配開頭

$ : 匹配結尾

? : 前面的字符可有可無

import  re
print(re.search(r"r\dn", "run r4n")) # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
print(re.search(r"r\Dn", "run r4n")) # <_sre.SRE_Match object; span=(0, 3), match='run'>
print(re.search(r"r\sn", "r\nn r4n")) # <_sre.SRE_Match object; span=(0, 3), match='r\nn'>
print(re.search(r"r\Sn", "r\nn r4n")) # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
print(re.search(r"r\wn", "r\nn r4n")) # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
print(re.search(r"r\Wn", "r\nn r4n")) # <_sre.SRE_Match object; span=(0, 3), match='r\nn'>
print(re.search(r"\bruns\b", "dog runs to cat")) # <_sre.SRE_Match object; span=(4, 8), match='runs'>
print(re.search(r"\B runs \B", "dog runs to cat")) # <_sre.SRE_Match object; span=(8, 14), match=' runs '>
print(re.search(r"runs\\", "runs\ to me")) # <_sre.SRE_Match object; span=(0, 5), match='runs\\'>
print(re.search(r"r.n", "r[ns to me")) # <_sre.SRE_Match object; span=(0, 3), match='r[n'>
print(re.search(r"^dog", "dog runs to cat")) # <_sre.SRE_Match object; span=(0, 3), match='dog'>
print(re.search(r"cat$", "dog runs to cat")) # <_sre.SRE_Match object; span=(12, 15), match='cat'>
print(re.search(r"Mon(day)?", "Monday")) # <_sre.SRE_Match object; span=(0, 6), match='Monday'>
print(re.search(r"Mon(day)?", "Mon")) # <_sre.SRE_Match object; span=(0, 3), match='Mon'>

程序執行結果:

<_sre.SRE_Match object; span=(4, 7), match='r4n'>
<_sre.SRE_Match object; span=(0, 3), match='run'>
<_sre.SRE_Match object; span=(0, 3), match='r\nn'>
<_sre.SRE_Match object; span=(4, 7), match='r4n'>
<_sre.SRE_Match object; span=(4, 7), match='r4n'>
<_sre.SRE_Match object; span=(0, 3), match='r\nn'>
<_sre.SRE_Match object; span=(4, 8), match='runs'>

None

<_sre.SRE_Match object; span=(0, 5), match='runs\\'>
<_sre.SRE_Match object; span=(0, 3), match='r[n'>
<_sre.SRE_Match object; span=(0, 3), match='dog'>
<_sre.SRE_Match object; span=(12, 15), match='cat'>
<_sre.SRE_Match object; span=(0, 6), match='Monday'>

<_sre.SRE_Match object; span=(0, 3), match='Mon'>

如果一個字符串有很多行, 我們想使用 ^ 形式來匹配行開頭的字符, 如果用通常的形式是不成功的. 比如下面的 “I” 出現在第二行開頭, 但是使用 r"^I" 卻匹配不到第二行, 這時候, 我們要使用 另外一個參數, 讓 re.search() 可以對每一行單獨處理.這個參數就是 flags=re.M, 或者這樣寫也行 flags=re.MULTILINE.

import  re
string = """a
dog runs to snake.
I run to cat.
"""
print(re.search(r'^I',string))# None
print(re.search(r"^I", string, flags=re.M)) # <_sre.SRE_Match object; span=(18, 19), match='I'>
print(re.search(r"^d", string, flags=re.M))
print(re.search(r"e", string, flags=re.M))

運行結果:

None
<_sre.SRE_Match object; span=(21, 22), match='I'>
<_sre.SRE_Match object; span=(2, 3), match='d'>

<_sre.SRE_Match object; span=(18, 19), match='e'>


發佈了301 篇原創文章 · 獲贊 365 · 訪問量 159萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章