欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫--正则解析方式

程序员文章站 2022-07-13 12:34:50
...

 

一.正则解析:

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

知识点:

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