python爬虫--正则解析方式
一.正则解析:
提取数据步骤:创建正则对象-->匹配查找-->提取数据保存;
知识点:
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”)
上一篇: POI2014 RAJ-Rally
下一篇: JQuery笔记12