python爬虫--正则解析方式

巧了我就是萌 提交于 2019-12-14 23:53:15

 

一.正则解析:

        提取数据步骤:创建正则对象-->匹配查找-->提取数据保存;

知识点:

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”)

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!