zoukankan      html  css  js  c++  java
  • The website is API(3)

    网络爬虫实战知识准备:

    Requests库、robots(网络爬虫排除标准)、BeautifulSoup库

    一、Re正则表达式

    1.

    简洁地表达一组字符串

    通用的字符串表达框架

    字符串匹配

    编译:

    2.语法

    字符+操作符

    操作符

    .:表示任何单个字符

    []:字符集,对单个字符给出取值范围

    [^]:非字符集,对单个字符给出排除范围

    *:前一个字符0次或无限次扩展

    +:前一个字符1次或无限次扩展

    ?:前一个字符0次或1次扩展

    |:左右表达式任意一个

    {m}:扩展前一个字符m次

    {m,n}:扩展前一个字符m至n次(含n)

    ^:匹配字符串开头

    $:匹配字符串结尾

    ():分组标记,内部只能用|操作符

    d:数字,等价于[0-9]

    w:单词字符串,等价于[A-Za-z0-9_]

    经典正则表达式实例

    ^[A-Za-z]+$ 由26个字母组成的字符串

    ^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串

    ^-?d+$ 整数形式的字符串

    ^[0-9]*[1-9][0-9]*$ 正整数形式的字符串

    [u4e00-u9fa5] 匹配中文字符串

     3.Re库介绍

    re.search(pattern,string,flags=0):在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象

     flags控制标记

    re.I 忽略正则表达式的大小写

    re.M 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始

    re.S 正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符

    >>> import re
    >>> match = re.search(r'[1-9]d{5}','BIT 100081')
    >>> if match:
        print(match.group(0))
    
        
    100081

    re.match(pattern,string,flags):从一个字符串的开始位置起匹配正则表达式,返回match对象

    >>> match = re.match(r'[1-9]d{5}','BIT 100081')
    >>> if match:
        print(match.group(0))
    
        
    >>> match.group(0)
    Traceback (most recent call last):
      File "<pyshell#9>", line 1, in <module>
        match.group(0)
    AttributeError: 'NoneType' object has no attribute 'group'

    >>> match = re.match(r'[1-9]d{5}','100081')
    >>> match.group(0)
    '100081'

    re.findall(pattern,string,flags):搜索字符串,以列表类型返回全部能匹配的子串

    >>> ls = re.findall(r'[1-9]d{5}','BIT100081 NPU100084')
    >>> ls
    ['100081', '100084']

    re.split(pattern,string,maxsplit=0,flags=0):将一个字符串按照正则表达式匹配结果进行分割,返回列表类型

    maxsplit:最大分割数

    >>> re.split(r'[1-9]d{5}','BIT100081 NPU100084')
    ['BIT', ' NPU', '']
    >>> re.split(r'[1-9]d{5}','BIT100081 NPU100084',maxsplit = 1)
    ['BIT', ' NPU100084']

    re.finditer(pattern,string,flags):搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象

    >>> for m in re.finditer(r'[1-9]d{5}','BIT100081 NPU100084'):
        if m:
            print(m.group(0))
    
            
    100081
    100084

    re.sub(pattern,rel,string,count,flags):在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

    repl:替换匹配字符串的字符串

    count:匹配的次数

    >>> re.sub(r'[1-9]d{5}',':zipcode','BIT100081 NPU100084')
    'BIT:zipcode NPU:zipcode'

    re.compile(pattern,flags)

    regex = re.compile(r'[1-9]d{5})

    regex.search().......

    这是面向对象的编译方法

     4.Re库的match对象

    属性:

    .string 待匹配的文本

    .re 匹配时使用的pattern对象(正则表达式)

    .pos 正则表达式搜索文本的开始位置

    .endpos .....结束位置

    方法:

    .group(0) 获得匹配后的字符串

    .start() 匹配字符串在原始字符串的开始位置

    .end() 。。。。。结束位置

    .span() 返回(.start(),.end())

    >>> import re
    >>> m = re.search(r'[1-9]d{5}','NPU100081 NPU100084')
    >>> m.string
    'NPU100081 NPU100084'
    >>> m.re
    re.compile('[1-9]\d{5}')
    >>> m.pos
    0
    >>> m.end
    <built-in method end of re.Match object at 0x03CEED40>
    >>> m.endpos
    19
    >>> m.group(0)
    '100081'
    >>> m.group(1)
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        m.group(1)
    IndexError: no such group
    >>> m.start()
    3
    >>> m.end()
    9
    >>> m.span()
    (3, 9)

     贪婪匹配:默认输出最长匹配

    >>> match = re.search(r'PY.*N','PYANBNCNDN')
    >>> match.group(0)
    'PYANBNCNDN'

    最小匹配

    >>> match = re.search(r'PY.*?N','PYANBNCNDN')
    >>> match.group(0)
    'PYAN'

    *?前一个字符0次或无限次扩展

    +?前一个字符1次或无限次扩展

    ?? 前一个字符0次或1次扩展

    {m,n}? 扩展前一个字符m至n次

    >>> match = re.search(r'PY.+?N','PYANBNCNDN')
    >>> match.group(0)
    'PYAN'
  • 相关阅读:
    Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression
    Codeforces Round #481 (Div. 3) G. Petya's Exams
    使用create-react-app 搭建react + ts + antd框架
    callback、promise和async、await的使用方法
    JS数组中Array.of()方法的使用
    react中替换关键字并且高亮显示的方法
    封装 jsonp请求数据的方法
    React的新特性 ---- Hooks ---- 的基本使用
    在canvas中使用其他HTML元素
    React的性能优化
  • 原文地址:https://www.cnblogs.com/kmxojer/p/11543299.html
Copyright © 2011-2022 走看看