zoukankan      html  css  js  c++  java
  • 爬虫之正则表达式

    1.学习爬虫,为什么必须会正则表达式?
        我们爬取一些网页具体内容时,只需要这个网页某个标签的一部分内容就足够,或者是这个标签的某个属性的值时,用普通的 xpath 或者css.selector是不能完成的,此时我们就需用到正则表达式去匹配获取。
    2.正则表达式官方简介?
        正则表达式,又称规则表达式。(在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

     1  '''
     2  正则表达式
     3  '''
     4  
     5  import re
     6  
     7  line = 'jijianXksA123'
     8 
     9 # ^a 表示匹配以a开头的字符串(只匹配一次)
    10 # . 表示该字符可为任意字符(只匹配一次)
    11 # * 表示前面的字符可以出现任意次(0次或多次)(多次匹配)
    12 reg_str01 = '^j.*'    # 表示以j开头的字符串
    13 # re.match 函数
    14 # 第一个参数是匹配的格式
    15 # 第二参数是要匹配的字符串
    16 # 返回值为:匹配成功,返回match对象,否则返回:None
    17 
    18 if re.match(reg_str01,line) :
    19     print("匹配成功!")  # reg_str = '^j.*'     匹配成功
    20 else:
    21     print("匹配失败!")  # reg_str = '^i.*'     匹配失败
    22 
    23 
    24 # 23$ 表示匹配以23结尾的字符串(只匹配一次)
    25 reg_str02 = '^j.*23$'
    26 if re.match(reg_str02,line) :
    27     print("匹配成功!")  # reg_str = '^j.*23$'     匹配成功
    28 else:
    29     print("匹配失败!")  # reg_str = '^j.*13$'     匹配失败
    30 
    31 
    32 line01 = 'boooboaobxby'
    33 # () 内的为 匹配模式,通过 group函数 可以取出匹配结果
    34 # 正则表达式贪婪匹配模式:从后面(右边)开始匹配
    35 reg_str03 = '.*(b.*b).*'
    36 test01 = re.match(reg_str03,line01)
    37 if  test01:
    38     print(test01.group(1))      # result : bxb
    39 else:
    40     print("匹配失败!")
    41 
    42 # 正则表达式非贪婪匹配模式:从前面(左边)开始匹配
    43 # ? : 表示从左边开始匹配,匹配到第一个符合模式的内容,即进入模式
    44 #
    45 reg_str03 = '.*?(b.*b).*'   # 半贪婪匹配
    46 reg_str04 = '.*?(b.*?b).*'  # 非贪婪匹配
    47 test01 = re.match(reg_str03,line01)
    48 test02 = re.match(reg_str04,line01)
    49 if  test01 and test02:
    50     print(test01.group(1))      # result : boooboaobxb
    51     print(test02.group(1))  # result : booob
    52 else:
    53     print("匹配失败!")
     1  import re
     2  line01 = 'boooboaobcxby'
     3  
     4  def regtest(reg_str,line = line01):
     5     test = re.match(reg_str, line)
     6     if test:
     7         print(test.group(1))
     8     else:
     9         print("匹配失败!")
    10 
    11 # + :表示前面的字符,至少出现一次
    12 reg_str04 = '.*(b.+b).*'  # (b.+b)表示b与b之间至少有一个字符
    13 regtest(reg_str04)      # result : bcxb
    14 
    15 # {n} : 控制前面字符出现次数
    16 # a{2} : 表示a出现两次
    17 # b{3,4} : 表示b至少出现3次,最多出4次
    18 # c{4,} : 表示c至少出现4次
    19 reg_str05 = '.*(b.{2}b).*'  # (b.{2}b)表示匹配到的b与b之间,只有两字符
    20 reg_str06 = '.*(b.{3,4}b).*'  # (b.{3,6}b)表示匹配到的b与b之间,至少有3个字符,至多有4个字符
    21 reg_str07 = '.*(b.{4,}b).*'  # (b.{8,}b)表示匹配到的b与b之间,至少有4个字符
    22 regtest(reg_str05)   # result : bcxb
    23 regtest(reg_str06)   # result : boaob
    24 regtest(reg_str07)   # result : boaobcxb
    25 
    26 # | :表示 或
    27 # (abc|123) : 表示匹配到 abc 或者 123,都算匹配成功
    28 reg_str08 = '.*(boo|abc)'
    29 reg_str09 = '.*(abc|boo)'
    30 regtest(reg_str08)   # result : boo
    31 regtest(reg_str09)   # result : boo
    32 
    33 # [] : 表示 里面包含的内容都可以进行匹配,包含内容只有表面字符含义
    34 # [abcd] : 表示 只要这个字符为 a/b/c/d中的一个都可以匹配成功
    35 # [0-9] : 表示 只要这个字符在 0-9 这个区间内,都可以匹配成功
    36 # [^x] : 表示匹配 字符不为 x
    37 line02 = '电话号:15573563467'
    38 reg_str10 = '.*(1[3458][0-9]{9}).*'
    39 reg_str11 = '.*(1[3458][^1]{9}).*'
    40 regtest(reg_str10,line02)   # result : 15573563467
    41 regtest(reg_str11,line02)   # result : 15573563467
    42 
    43 # s 表示匹配空格,匹配一次
    44 # S 表示匹配不是空格的字符,匹配一次
    45 # w 表示匹配 A-Z、0-9、_ 中的容易字符,匹配一次
    46 # W 与 w 相反
    47 # d 表示数字
    48 # [u4E00-u9FA5] : 表示所有汉字,unicode 编码
    49 
    50 def regtest_test(reg_str,line = line01):
    51     test = re.match(reg_str, line)
    52     if test:
    53         print(test.group(1)+':'+test.group(2)+'-'+test.group(3)+'-'+test.group(4))
    54     else:
    55         print("匹配失败!")
    56 
    57 # 简单实例
    58 str01 = '张三出生于1997年12月20日'
    59 str02 = '李四出生于1989-01-20'
    60 str03 = '王五出生于1997/2/5'
    61 str04 = '赵六出生于1997.12.20'
    62 str = [str01,str02,str03,str04]
    63 # 提取出姓名+出生日期
    64 # 匹配模式
    65 reg_str12 = '(.*)出生于(d{4})[.年/-](d{1,2})[.月/-](d{1,2}).*?'
    66 for i in range(4):
    67     regtest_test(reg_str12,str[i])
    68 # result :
    69 #       张三:1997-12-20
    70 #       李四:1989-01-20
    71 #       王五:1997-2-5
    72 #       赵六:1997-12-20

    注:此文来自网络,回归网络

  • 相关阅读:
    文章截断显示方法
    mysql数据库基础知识和认识
    js 返回上一页和刷新以及页面跳转
    编译原理根据项目集规范族构造LR(0)分析表
    编译原理LR(0)项目集规范族的构造详解
    编译原理复习
    FIRST集合、FOLLOW集合及LL(1)文法求法
    UML时序图
    UML活动图(二)
    UML活动图(Activity Diagram)
  • 原文地址:https://www.cnblogs.com/Lee1010/p/10222393.html
Copyright © 2011-2022 走看看