FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [View Raw Code]   [Original HTTPS Page]

Notes/python-basic-notes/python-days/Day_51.md at master · We2one/Notes · GitHub

/ Notes Public

Latest commit

 

History

History
324 lines (254 loc) · 10.9 KB

File metadata and controls

324 lines (254 loc) · 10.9 KB

正则表达式

正则表达式在爬虫优势

  • 爬虫四个步骤
    1. 明确目标 (确定爬取范围和网站)
    2. 爬 (爬取网站所有内容)
    3. 取 (去掉没用的数据)
    4. 处理数据 (按照需求进行存储和使用)

基础正则表达式语法

  • 正则表达式 (规则表达式) : 通常用来检索、替换那些符合某些规则的文本; 是由普通字符和特殊字符(元字符)组成的文字模式
  • 正则表达式 : 对字符串操作的一种逻辑公式,事先用一些定义好的一些特定字符、及这些特定字符的组合组成一个 "规则字符串",这个规则字符串是一种过滤逻辑
  • 匹配 : 给定的字符串是否符合正则表达式的过滤逻辑
  • 过滤 : 通过正则表达式,从文本字符串中获取我们想要的特定部分
常见元字符
  • 正则表达式元字符列表



















    分类 元字符 含义
    匹配边界 ^ 匹配行首
    $ 匹配行尾
    重复次数 ? 重复匹配 0 次或 1 次
    * 重复匹配 0 次或 更多次
    + 重复匹配 1 次或 更多次
    {n, } 重复 n 次或 更多次
    {n, m} 重复 n~m 次
    {n} 重复 n 次
    各种字符的表示 [a-z] 任意 a~z 的字母
    [abc] a/b/c 中的任意一个字符
    [^123abc] 匹配除了 123abc 这几个字符以外的任意字符
    . 匹配除换行符以外的任意一个字符
    \b 匹配一个单词的边界
    \B 匹配不是单词的开始和结束位置
    \d 匹配数字
    \D 匹配任意非数字的字符
    \w 匹配字母、数字、下划线
    \W 匹配任意不是字母、数字、下划线的字符
    \s 匹配任意空白,包括空格、制表符、换行符
    \S 匹配任意不是空白符的字符
    其他 [^a] 匹配除了 a 以外的任意字符
    123|abc 匹配 123 或 abc
python 中正则表达式模块 -- re
  1. Python 使用 re 模块 使用正则表达式,使用正则表达式的情况下如果要使用原始字符串就要在字符串前加一个 r 前缀

  2. re 模块的一般使用步骤

    1. 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
    2. 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象
    3. 最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其它的操作
  3. compile 函数 : pattern = re.compile("正则表达式")

    1. compile 函数用于编译正则表达式,生成一个 Pattern 对象

    2. 利用 pattern 的一系列方法对文本进行匹配查找

    3. Pattern 常用方法

      方法 描述
      .match(string, start, end) 从起始位置开始查找,一次匹配
      .search(string, start, end) 从任何位置开始查找,一次匹配
      .findall(string, start, end) 全部匹配,返回列表
      .finditer(string, start, end) 全部匹配,返回迭代器
      .split(String, Macsplit) 分割字符串,返回列表
      .sub(repl, String, Count) 替换
  4. Pattern 对象常用方法

    1. match 方法 : 查找字符串的头部 (也可以指定起始位置), 一次匹配,只要找到一个匹配结果就返回,不是查找所有匹配结果

      1. 一般使用形式

        Match = pattern.match(
        	string,  # 要匹配的目标字符串
            start,  # 要匹配的目标字符串的起始位置 (可选参数)
            end  # 结束位置 (可选参数)
        )
      2. 参数

        1. string : 待匹配字符串
        2. start : 字符串的起始匹配位置,默认值为 0 可选参数
        3. end : 字符串匹配的结束位置, 默认值为字符串长度 可选参数
      3. 当匹配成功时返回一个 Match 对象,如果没有匹配上,则返回 None

    2. search 方法 : 查找字符串的任何位置,一次匹配,找到一个匹配的结果就返回,而不是所有的匹配结果

      1. 一般使用形式

        Match = pattern.search(
        	string,  # 要匹配的目标字符串
            start,  # 要匹配目标字符串的起始位置 (可选参数)
            end  # 结束位置 (可选参数)
        )
      2. 参数

        1. string : 待匹配字符串
        2. start : 字符串的起始匹配位置,默认值为 0 可选参数
        3. end : 字符串匹配的结束位置, 默认值为字符串长度 可选参数
      3. 当匹配成功时返回一个 Match 对象,如果没有匹配上,则返回 None

    3. findall 方法 : 查找整个字符串,多次匹配,返回所有匹配对象的列表

      1. 一般使用形式

        Match = pattern.findall(
        	string,  # 要匹配的目标字符串
            start,  # 要匹配目标字符串的起始位置 (可选参数)
            end  # 结束位置 (可选参数)
        )
      2. 参数

        1. string : 待匹配字符串
        2. start : 字符串的起始匹配位置,默认值为 0 可选参数
        3. end : 字符串匹配的结束位置, 默认值为字符串长度 可选参数
      3. 以列表形式返回全部能匹配的子串,如果没有匹配返回一个空列表

    4. finditer 方法 : 与 findall 类似,搜索整个字符串,获取所有匹配结果,返回一个顺序访问没一个匹配结果 (Match 对象) 的迭代器

      1. 一般使用形式

        Match = pattern.finditer(
        	string,  # 要匹配的目标字符串
            start,  # 要匹配目标字符串的起始位置 (可选参数)
            end  # 结束位置 (可选参数)
        )
      2. 参数

        1. string : 待匹配字符串
        2. start : 字符串的起始匹配位置,默认值为 0 可选参数
        3. end : 字符串匹配的结束位置, 默认值为字符串长度 可选参数
      3. 返回一个顺序访问没一个匹配结果 (Match 对象) 的迭代器

    5. split 方法 : 按照能够匹配的子串将字符串分割后返回列表

      1. 一般使用形式

        Match = pattern.split(
        	String,  # 要匹配的目标字符串
            Maxsplit  # 指定最大分隔次数,默认全部分隔,可选
        )
      2. 参数

        • Maxsplit : 指定最大分隔次数,默认全部分隔,可选
    6. sub 方法 : 用于替换指定字符串中指定字符

      1. 一般使用形式

        Match = pattern.sub(
        	repl,  # 替换成什么
            String,  # 替换什么
            Count  # 替换次数, 可选
        )
      2. 参数

        1. repl : 可以是字符串也可以是一个函数
          1. repl 是字符串 : 会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串;另外 repl 还可以使用 id 的形式来引用分组,但不能使用编号 0
          2. repl 是函数 : 这个方法应当只接受一个参数 (Match 对象),并返回一个字符串用于替换(返回的字符串中不能在引用分组)
        2. count : 指定最多替换次数,不指定时全部替换
      3. 实例

        s = "zhangsan:20000,list:3000"
        
        p = re.compile("(\w+):(\w+)")
        
        print(p.sub(r'lisi:500', s, 1))  # lisi:500,list:3000
        print(p.sub(r'\2 \1', s))  # 20000 zhangsan,3000 list
        
        def func(m):
        	print(m.group())
        	return m.group(1) + '\t' + str(int(m.group(2)) + 200)
        
        print(p.sub(func, s))  # zhangsan	20200,list	3200
        print(p.sub(func, s, 1))  # zhangsan	20200,list:3000
  5. 匹配中文 : 匹配中文的 unicode 编码,中文的 unicode 编码范围主要在 [u4e00-u9fa5] (不包括全角中文标点)

  6. re.S 在正则中的作用

    • 正则表达式中 "." 的作用是匹配除 "\n" 以外的任何字符,也就是说,只可以在一行中匹配,遇到换行符就结束.HTML 中 a字符每行末尾都有一个不可见的换行符
    • 使用 re.S 正则表达式可以将字符串作为一个整体,将 "\n" 当做一个普通字符加入这个字符串,参与匹配
贪婪模式与非贪婪模式
  1. 贪婪模式 : 在整个表达式匹配成功的前提下,尽可能多的匹配 (*)
  2. 非贪婪模式 : 在整个表达式匹配成功的前提下,尽可能少的匹配 (?)
正则表达式分组
  • 分组在正则表达式中使用 ()表示,一个括号就是一个分组
  • 分组的作用
    1. 筛选特点内容 : 通过给特点的内容加一个 (), 将来可以通过 group(1) 的方式获取到括号内信息
    2. 反向引用 : 可以在同一个表达式中引用前面的分组表达式

Back | FazBrowse Home | New Git URL