歡迎使用CSDN markdown編輯器

2021-07-25 12:04:35 字數 4549 閱讀 4325

[toc]來生成目錄:

正規表示式特殊序列

re模組

re.compile(pattern[, flags])

把正規表示式的模式和標識轉化成正規表示式物件,供 match() 和 search() 這兩個函式使用。

re 所定義的 flag 包括:

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 為了增加可讀性,忽略空格和』 # 』後面的注釋

以下兩種用法結果相同:(a)

compiled_pattern = re.compile(pattern)

result = compiled_pattern.match(string)

(b)result = re.match(pattern, string)

s = 『abc\-001』 # python的字串

#對應的正規表示式字串變成:

#』abc-001』

因此我們強烈建議使用python的r字首,就不用考慮轉義的問題了

s = r』abc-001』 # python的字串

對應的正規表示式字串不變:

『abc-001』

search

re.search(pattern, string[, flags])`

在字串中查詢匹配正規表示式模式的位置,返回 matchobject 的例項,如果沒有找到匹配的位置,則返回 none。

對於已編譯的正規表示式物件來說(re.regexobject),有以下 search 的方法:

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

若 regex 是已編譯好的正規表示式物件,regex.search(string, 0, 50) 等同於 regex.search(string[:50], 0)。

pattern.search("abcde")     # match at index 0 

pattern.search("abcde", 1) # no match;

match

re.match(pattern, string[, flags])

判斷 pattern 是否在字串開頭位置匹配。對於 regexobject,有:

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

match() 函式只在字串的開始位置嘗試匹配正規表示式,也就是只報告從位置 0 開始的匹配情況,而 search() 函式是掃瞄整個字串來查詢匹配。如果想要搜尋整個字串來尋找匹配,應當用 search()。

雖然,match預設是從開頭匹配,但是,如果指定位置,仍然能成功;但是!match也是從指定位置開始匹配,不匹配仍然會失敗,這一點就和search有區別啦。

match()方法判斷是否匹配,如果匹配成功,返回乙個match物件,否則返回none。

test = '使用者輸入的字串'

if re.match(r'正規表示式', test):

print('ok')

else:

print('failed')

split

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

此功能很常用,可以將將字串匹配正規表示式的部分割開並返回乙個列表。對 regexobject,有函式:

split(string[, maxsplit=0])

對於乙個找不到匹配的字串而言,split 不會對其作出分割

>>>

'a b c'.split(' ')

['a', 'b', '', '', 'c']

這裡用字串自帶的split方法就很不靈活。

>>> re.split(r'\s+', 'a b c')

['a', 'b', 'c']

看出差別了吧,很強大!再來乙個終極的:

>>> re.split(r'[\s\,\;]+', 'a,b;; c d')

['a', 'b', 'c', 'd']

r'[\s\,\;]+'的正規表示式意思為:空格或者,或者;`出現1次或1次以上都是滿足條件的分割符號!所以,最後結果還是很乾淨。

findall

re.findall(pattern, string[, flags])

在字串中找到正規表示式所匹配的所有子串,並組成乙個列表返回。同樣 regexobject 有:

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

#get all content enclosed with , and return a list

>>> pattern=re.compile(r'hh')

>>> pattern.findall('hhmichaelhh')

['hh', 'hh']

finditer

re.finditer(pattern, string[, flags])

和 findall 類似,在字串中找到正規表示式所匹配的所有子串,並組成乙個迭代器返回。同樣 regexobject 有:

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

subre.sub(pattern, repl, string[, count, flags])

在字串 string 中找到匹配正規表示式pattern 的所有子串,用另乙個字串 repl 進行替換。如果沒有找到匹配 pattern 的串,則返回未被修改的 string。repl 既可以是字串也可以是乙個函式。

返回值是替換後的新字串。

對於 regexobject 有:

sub(repl, string[, count=0])

>>> pattern=re.compile(r'\d')

>>> pattern.sub('no','12hh34hh')

'nonohhnonohh'

>>> pattern.sub('no','12hh34hh',0)

'nonohhnonohh'

>>> pattern.sub('no','12hh34hh',count=0)

'nonohhnonohh'

>>> pattern.sub('no','12hh34hh',1)

'no2hh34hh'

通過上面的例子,可以看出,count是可以預設的,同時,預設值是0,表示全部替換;否則,就是指定替換幾個。

subn

re.subn(pattern, repl, string[, count, flags])

該函式的功能和 sub() 相同,但它還返回新的字串以及替換的次數。同樣 regexobject 有:

subn(repl, string[, count=0])

>>> pattern.subn('no','12hh34hh',count=0)

('nonohhnonohh', 4)

分組除了簡單地判斷是否匹配之外,正規表示式還有提取子串的強大功能。用()表示的就是要提取的分組(group)。比如:

^(\d)-(\d)$分別定義了兩個組,可以直接從匹配的字串中提取出區號和本地號碼:

m = re.match(r』^(\d)-(\d)$』, 『010-12345』)

m <_sre.sre_match object span="(0," match="』010-12345』">

m.group(0)

『010-12345』

m.group(1)

『010』

m.group(2)

『12345』

m.groups()

(『010』, 『12345』)

「`

通過實驗,如果不用括號,得到的match物件課可以使用例如a.group(0)或者a.group()但是,使用a.group(1)就會報錯的。

貪婪匹配

正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元。舉例如下,匹配出數字後面的0:

re.match(r』^(\d+)(0*)$』, 『102300』).groups()

(『102300』, 」)

由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了。

必須讓\d+採用非貪婪匹配(也就是盡可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配:

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...