re模塊--高級用法


re.search函數會在字符串內查找模式匹配,只要找到第一個匹配然后返回,如果字符串沒有匹配,則返回None。

格式:re.search(pattern, string, flags=0)

需求:匹配出文章閱讀的次數

#coding=utf-8 import re ret = re.search(r"\d+", "閱讀次數為 9999") ret.group() 

運行結果:

'9999' 

match()和search()的區別:

match()函數只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配;

也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none。

如:print(re.match(‘super’, ‘superstition’).span()) 會返回(0, 5)

​ print(re.match(‘super’, ‘insuperable’)) 則返回None

如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)

​ print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)

2、findall

re.findall遍歷匹配,可以獲取字符串中所有匹配的字符串,返回一個列表。

格式:re.findall(pattern, string, flags=0)

需求:統計出python、c、c++相應文章閱讀的次數

#coding=utf-8 import re ret = re.findall(r"\d+", "閱讀次數:9999次,轉發次數:883次,評論次數:3次") print(ret) 

運行結果:

['9999', '883', '3'] 

3、sub 將匹配到的數據進行替換

使用re替換string中每一個匹配的子串后返回替換后的字符串。

格式:re.sub(pattern, repl, string, count)

需求:將匹配到的閱讀次數加1

方法1:

#coding=utf-8 import re ret = re.sub(r"\d+", "10000", "閱讀次數:9999次,轉發次數:883次,評論次數:3次") print(ret) 

運行結果:

閱讀次數:10000次,轉發次數:10000次,評論次數:10000次 

方法2:

#coding=utf-8 import re def add(temp): strNum = temp.group() num = int(strNum) + 1 return str(num) ret = re.sub(r"\d+", add, "python = 997") print(ret) ret = re.sub(r"\d+", add, "python = 99") print(ret) 

運行結果:

python = 998 python = 100

4、split 根據匹配進行切割字符串,並返回一個列表

按照能夠匹配的子串將string分割后返回列表。

可以使用re.split來分割字符串,如:re.split(r'\s+', text);將字符串按空格分割成一個單詞列表。

格式:re.split(pattern, string[, maxsplit])

需求:切割字符串“info:xiaoZhang 33 shandong”

#coding=utf-8 import re ret = re.split(r":| ","info:xiaoZhang 33 shandong") print(ret) 

運行結果:

['info', 'xiaoZhang', '33', 'shandong']

5、python貪婪和非貪婪

Python里數量詞默認是貪婪的(在少數語言里也可能是默認非貪婪),總是嘗試匹配盡可能多的字符;

非貪婪則相反,總是嘗試匹配盡可能少的字符。

在"*","?","+","{m,n}"后面加上?,使貪婪變成非貪婪。

import re # 匹配多個數字 result = re.match(r"aaa(\d+)", "aaa123456") if result: print(result.group()) else: print("匹配失敗~!") 

匹配的結果:

aaa123456

解決方式:非貪婪操作符“?”,這個操作符可以用在"*","+","?"的后面,要求正則匹配的越少越好。

# 匹配多個數字 result = re.match(r"aaa(\d+?)", "aaa123456") if result: print(result.group()) else: print("匹配失敗~!") 

運行結果:

aaa1

6、r的作用

>>> mm = "c:\\a\\b\\c" >>> mm 'c:\\a\\b\\c' >>> print(mm) c:\a\b\c >>> re.match("c:\\\\",mm).group() 'c:\\' >>> ret = re.match("c:\\\\",mm).group() >>> print(ret) c:\ >>> ret = re.match("c:\\\\a",mm).group() >>> print(ret) c:\a >>> ret = re.match(r"c:\\a",mm).group() >>> print(ret) c:\a >>> ret = re.match(r"c:\a",mm).group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'group' >>> 

說明

Python中字符串前面加上 r 表示原生字符串

與大多數編程語言相同,正則表達式里使用"\"作為轉義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符"\",那么使用編程語言表示的正則表達式里將需要4個反斜杠"\\":前兩個和后兩個分別用於在編程語言里轉義成反斜杠,轉換成兩個反斜杠后再在正則表達式里轉義成一個反斜杠。

Python里的原生字符串很好地解決了這個問題,有了原生字符串,你再也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀。

>>> ret = re.match(r"c:\\a",mm).group() >>> print(ret) c:\a
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM