一.正則解析:
提取數據步驟:創建正則對象-->匹配查找-->提取數據保存;
知識點:
1.單字符:
. : 除換行以外所有字符
[] :[aoe] [a-w] 匹配集合中任意一個字符
\d :數字 [0-9]
\D : 非數字
\w :數字、字母、下劃線、中文
\W : 非\w
\s :所有的空白字符包,括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S : 非空白
2.數量修飾:
* : 任意多次 >=0
+ : 至少1次 >=1
? : 可有可無 0次或者1次
{m} :固定m次 hello{3,}
{m,} :至少m次
{m,n} :m-n次
3.邊界:
$ : 以某某結尾
^ : 以某某開頭
4.分組:
(ab)
貪婪模式 .*
非貪婪(惰性)模式 .*?
re.I : 忽略大小寫
re.M :多行匹配
re.S :單行匹配
re.sub(正則表達式, 替換內容, 字符串)
應用舉例一:
import re
line = "bobby123"
regex_str = "^b.*"
# 必須以b開頭,任意字符匹配
(^控制開頭字符)
regex_str1 = "^b.3$"
#(.*3$)必須以3結尾;
(^b.3$)不能運行成功,若改爲(^b.*3$)則可以;
($控制結位字符,.表示匹配任意字符,*表示匹配的次數)
if re.match(regex_str,line):
print("yes")
應用舉例二:(貪婪匹配模式和非貪婪匹配模式的區分)
ps: .*?爲非貪婪匹配模式 ; 貪婪匹配:反向匹配;
line2 = "boooooooobby123"
regex_str2 = ".*(b.+b).*"
regex_str2 = ".*(b.*b).*"
regex_str2 = ".*(b.{3,}b).*" #匹配兩次以上
regex_str2 = ".*(b.{2,5}b).*" #匹配兩次以上5次一下
regex_str2 = "( (boooooooobby|bobby)123)" #(|爲或;雙重()號則爲全匹配)
regex_str2 = "([abcd]ooby)123"#([]括號表示符合括號在內都行;符合abcd任意都行)
應用舉例三:(中括號用途例子)
[.*] 中括號內.*不代表模式匹配;
[^] 取反 不等於;
電話號匹配 line = ‘18782902222’
regex_str2 = “1[48357][0-9]{9}”#區間0-9出現9次
regex_str2 = “1[48357][^1]{9}”#數字不等於1出現9次
#非貪婪匹配:
regex_str2 = ".*?(b.*b).*?"
match_obj = re.match(regex_str2,line2)
if match_obj:
print(match_obj.group(1))
注意:match()函數 從字符串起始位置匹配;
group()可以返回match對象中匹配的值;
其他函數 :compile() search() findall() finditer() split() sub()
參考:https://www.runoob.com/python/python-reg-expressions.html
應用舉例四:(提取中文)
[\u4E00-\u9FA%] :提取中文
Line = “study in 南京大學”
Ewgex_str = “.*?( [\u4E00-\u9FA%]+大學)“
#(.*匹配任意字符) 輸出:京大學
#(.*?匹配任意字符) 輸出:南京大學即爲非貪婪匹配
Match_obj = re.match(regex_str,line)
If match_obj:
Print(match_obj.group(1))
應用舉例五:(\d :代表數字 提取連續數字\d+)
Line = “xx出生於2001年”
Ewgex_str = “.*?(\d+)年”
Ewgex_str = “.*(\d{4}+)年”#限定四次;
#(.*匹配任意字符) 輸出:2001
#(.*?匹配任意字符) 輸出:2001
Match_obj = re.match(regex_str,line)
If match_obj:
Print(match_obj.group(1))
綜合案例:
import re
Line = “xxx出生於2001年6月1日”
Line = “xxx出生於2001/6/1日”
Line = “xxx出生於2001-6-1”
Line = “xxx出生於2001-06-01”
Line = “xxx出生於2001-06”
Regex_str = “.*出生於(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|&))”
Match_obj = re.match(regex_str,Line)
If Match_obj:
Print(“yes”)