Python爬虫之正则表达式

Python爬虫之正则表达式

什么是正则表达式?

正则表达式是通过一些特殊的符号组成的字符串,这组字符串被称为模板;通过模板然后与目标串进行匹配,将与之相匹配的字符串取出。这就是正则表达式的作用

正则表达式的特殊字符

  • “ . ”符号可以匹配除换行符意外的任意一个字符

    • r = re.match(r'a.c', 'a你c').group()
      print(r)
      #a你c
      r = re.match(r'a.c', 'aBc').group()
      print(r)
      #aBc
      r = re.match(r'a.c', 'acc').group()
      print(r)
      #acc
      
  • “ | ”逻辑或字符

    • r = re.match(r'a|b', 'ab')
      print(r)
      #输出结果为:a
      r = re.match(r'a|b', 'a')
      print(r)
      #输出结果为:a
      r = re.match(r'a|b', 'b')
      print(r)
      #输出结果为:b
      r = re.match(r'a|b', 'ba')
      print(r)
      #输出结果为:b
      
  • “ ^ ” 取反符号,对字符集取反

    • r = re.match(r'速度与激情[^12345678]', '速度与激情9')
      print(r.group())
      #输出结果为:速度与激情9
      
  • “ [] ” 匹配方括号中的一个字符

    • r = re.match(r'[abc]2', 'a2')
      print(r.group())
      #输出结果为:a2
      
  • “ - ”区间符号如a-z匹配a到z中的任意一个字符

    • r = re.match(r'速度与激情[1-8a-z]', '速度与激情a')
      print(r.group())
      #输出结果为:速度与激情a
      
  • “ \ ”对紧跟其后的一个字符进行转义

    • r = re.match(r'速度\.激情[1-8a-z]', '速度.激情a')
      print(r.group())
      #输出结果为:速度.激情a
      
  • “ \d ” 匹配0-9中的任意一个数字

    • # r = re.match(r'[\d]*', '123')
      # print(r.group())
      #输出结果为为:123
      
  • “ \D ”匹配除0-9数字之外的字符,相当于[^\d]

    • r = re.match(r'速度与激情\D', '速度与激情a')
      print(r.group())
      #输出结果为:速度与激情a
      
  • “ \w ”匹配任意一个字符、数字、下划线

    • r = re.match(r'[\w]*', 'hfi')
      print(r.group())
      #输出结果为:hfi
      
  • “ \W ”匹配除数字、字符、下划线意外的任意,相当于[^\w]

    • ptn = '\W-age'
      lst = ['1-age', 'A-age', '!-age', '_-age']
      r = re.match(ptn, lst[2])
      print(r.group())
      #输出结果为:!-age
      
  • “ \s ”匹配制表符、空格、换行符等空白字符中的任意一个

    • r = re.match(r'\s', ' ')
      print(r.group())
      #输出结果为:" "
      r = re.match(r'\s', '\n')
      print(r.group())
      #输出结果为:" 
      "
      r = re.match(r'\s', '\t')
      print(r.group())
      #输出结果为:"  "
      
  • “ \S ”相当于\s的取反操作,[^\s]

    • ptn = 'p\Sy'
      lst = ['p ysdf', 'pyyfdsfp yfds', 'p y', 'p_y']
      r = re.match(ptn, lst[1])
      print(r.group())
      #输出结果为:pyy
      
  • “ {n} ”表达式重复n次,如\d{2} == \d\d;a{3} = aaa

  • ptn = '[\w]{6}'
    lst = ['hello', 'python', '#$%^&', '123456']
    r = re.match(ptn, lst[1])
    print(r.group())
    #输出结果为:python
    
  • “ {n,} “表达式至少重复n次,可以是无限次

    • ptn = '[\w]{4,}'
      lst = ['sdiu', '48246', 'fasdfhasoduhtfouasdhfuhasiufhw9iuhfoasdhfiuasdhfuasdhiu', 'fds']
      for list in lst:
          r = re.match(ptn, list)
         	print(r.group())
      #输出结果为:
      #sdiu
      #48246
      #fasdfhasoduhtfouasdhfuhasiufhw9iuhfoasdhfiuasdhfuasdhiu
      #None
      
  • ” {n,m} “表达式至少重复n次至多重复m次

    • ptn = '[\w]{3,6}'
      lst = ['hello', 'thang', '#$%^', '#$', '123456', '12_']
      for list in lst:
          r = re.match(ptn, list)
      	print(r.group())
      #输出结果为:
      #hello
      #thang
      #None
      #None
      #123456
      #12_
      
  • ” ? “匹配表达式0次或1次

    • ptn = 'h[a-z]?'
      lst = ['hello', 'abc', 'xxx', 'h']
      for lt in lst:
          r = re.match(ptn, lt)
          print(r)
      #输出结果为:
      #<re.Match object; span=(0, 2), match='he'>
      #None
      #None
      #<re.Match object; span=(0, 1), match='h'>
      
  • ” + “表达式至少出现1次之多可以出现无限次

    • ptn = 'h[a-z]+'
      lst = ['hello', 'abc', 'xxx', 'h']
      for lt in lst:
          r = re.match(ptn,lt)
          print(r)
      #输出结果为:	
      #<re.Match object; span=(0, 5), match='hello'>
      #None
      #None
      #None
      
  • ” * “表达式出现0次到无限次

    • ptn = 'h[a-z]*'
      lst = ['hellofsadugfiusdahufhsdufhs', 'abc', 'xxx', 'h']
      for lt in lst:
          r = re.match(ptn, lt)
          print(r)
      #输出结果为:
      #<re.Match object; span=(0, 27), match='hellofsadugfiusdahufhsdufhs'>
      #None
      #None
      #<re.Match object; span=(0, 1), match='h'>
      

正则表达式的长用方法

  • match(pattern, string,flag=0)

    • match()是从头开始匹配的
  • pattern:是正则表达式,如果匹配成功返回一个match()对象,如果匹配失败返回None

    • 第二个参数表示要匹配的字符

    • 是标致位用于控制正则表达式的匹配方式:如,是否区分大小写,多行匹配

    strA = ‘python’
    str = ‘pythonnand java’
    r = re.match(strA, str)
    print®
    print(r.group())
    print(r.start())
    print(r.end())
    print(r.span())
    #输出结果为:
    <re.Match object; span=(0, 6), match=‘python’>
    python
    0
    6
    (0, 6)

    
    
  • compile(ptn, flag)

    • flag:

      • re.A ASCll匹配
      • re.I 匹配不区分大小写
      • re.S 可以换行匹配
    •   ptn = re.compile(r'abc', re.I)
        r = ptn.match('ABC123')
        print(r)
        #输出结果为:
        #<re.Match object; span=(0, 3), match='ABC'>
      
  • search()查找不用从文本开头开始

    • ptn = 'abc'
      string = '123abc567abc789'
      r = re.search(ptn, string)
      print(r.group())
      #输出结果为;
      #abc
      
  • findall(ptn, str, flags)

    • ptn1 = 'abc'
      ptn2 = 'ABC'
      string = '123abc567abc789'
      r = re.findall(ptn1,string)
      print(r)
      z = re.findall(ptn2,string)
      print(z)
      #输出结果为;
      #['abc', 'abc']
      #[]
      
  • split(ptn, str, maxsplit, flags)

    •   r = re.findall(r'\d{1,}', '8+7*5+6/3')#['8', '7', '5', '6', '3']
        print(r)
        #输出结果为:['8', '7', '5', '6', '3']
        r = re.split(r'[\+\*/]', '8+7*5+6/3')#['8', '7', '5', '6', '3']
        print(r)
        #输出结果为;['8', '7', '5', '6', '3']
        r = re.split(r'[\+\*/]', '8+7*5+6/3', maxsplit=2)#['8', '7', '5+6/3']
        print(r)
        #输出结果为:['8', '7', '5+6/3']
      
  • sub(oldstr, newstr, str[])

    •   s = 'i am thaqy i am nice to meet you ! i like python'
        r = re.sub(r'i', 'I', s)
        print(r)
        #输出结果为:I am thaqy I am nIce to meet you ! I lIke python
      

分组功能

分组就是在匹配到的数据中再次筛选

例如:

题目需求是匹配到88和55
text  = 'apple price is $88, orange price is $55'
r = re.search(r'.+(\$\d+).+(\$\d+)', text)
print(r.groups())
print(r.group(1))
print(r.group(2))
#输出结果为:
('$88', '$55')
$88
$55

位置匹配

  • " ^ "在字符串开始的地方匹配,符号本身不匹配任何字符

    • r = re.match(r'^abc', 'abcdef')
      print(r.group())
      #输出结果为:abc
      
  • " $ "在字符串结束的地方匹配,符号本身不匹配任何字符

    • r = re.match(r'a.c$', 'abc')
      print(r.group())
      #输出结果为:abc
      

贪婪匹配和非贪婪匹配

  • 贪婪匹配

    • 匹配

      abc

    • r = re.match(r'<div>.*</div>', '<div>abc</div><div>bcd</div>')
      print(r.group())
      #输出结果为:<div>abc</div><div>bcd</div>
      
  • 非贪婪匹配

    • r = re.match(r'<div>.*?</div>', '<div>abc</div><div>bcd</div>')
      print(r.group())
      #输出结果为:<div>abc</div>
      
      
  • 28
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值