Python 爬虫学习笔记 – 第三周/单元7/Re(正则表达式)库入门

English Version: https://today2tmr.com/en/2017/07/17/python-spider-study-note-week-threeunit-sevenintroduction-to-reregular-expression

正则表达式的概念

  • regular expression / regex / RE
  • 用于简洁表达一组字符串
  • 通用的字符串表达框架
  • 判断字符串特征归属,匹配
  • eg:
    • ‘PY’开头,后续不超过10个字符,后续不含’Y’和’P’
    • PY[^PY]{0,10}

编译:

  • 将符合正则表达式语法的字符串转换为正则表达式特征。p=re.compile(regex)

正则表达式的语法

  • 由字符和操作符组成
操作符 说明 实例
. 表示任何单个字符
[] 字符集,对单个字符给出取值范围 [abc]表示a,b,c,[a-z]表示a到z单个字符
[^] 非字符集,对单个字符给出排除范围 [^abc]表示非a,非b,非c的单个字符
* 前一个字符0次或无限次扩展 abc*表示ab,abc,abcc,abccc等
+ 前一个字符1次或无限次扩展 abc+表示abc,abcc,abccc等
? 前一个字符0次或1次扩展 abc?表示ab,abc
| 左右表达式任意一个 abc|def表示abc,def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc,abbc
^ 匹配字符串开头 ^abc表示abc且在一个字符串开头
$ 匹配字符串结尾 abc$表示abc且在一个字符串结尾
() 分组标记,内部只能使用 | 操作符 (abc)表示abc,(abc|def)表示abc,def
\d 数字,等价于[0-9]
\w 单词字符,等价于[A-Za-z0-9]

实例

  • P(Y|YT|YTH|YTHO)?N: PN,PYN,PYTN,PYTHN,PYTHON
  • PYTHON+: PYTHON,PYTHONN,PYTHONNN…
  • PY[TH]ON: PYTHN,PYTON
  • PY[^TH]?ON: PYON,PYaON,PYbON,PYcON…
  • PY{:3}N: PN,PYN,PYYN,PYYYN
  • ^[A-Za-z]+$ 由26个字母组成的字符串
  • ^[A-Za-z0-9]$ 由26个字母和数字组成的字符串
  • ^-?\d+$ 整数形式的字符串
  • ^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
  • [1-9]\d{5} 中国境内邮政编码,6位
  • [\u4e00-\u9fa5] 匹配中文字符,utf-8
  • \d{3}-\d{8}|d{4}-\d{7} 国内电话号码,010-68913536
  • 匹配IP地址的正则表达式,分4短,每段0-255:
    • [1-9]?\d: 0-99
    • 1\d{2}: 100-199
    • 2[0-4]\d: 200-249
    • 25[0-5]: 250-255
    • (([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])

Re库的基本使用

  • Python标准库,不需要额外安装。
  • 调用import re
  • 正则表达式表示类型
    • raw string类型(原生字符串类型)
      • r['text']r'[1-9]\d{5}'
      • 在字符串前加r
      • 不包含转义符\的字符串,即\不被解释为转义符
    • string类型,更繁琐
      • '[1-9]\\d{5}'
      • \需要增加额外\

主要功能函数

  • re.search(pattern,string,flags=0) 搜索匹配re的第一个位置,返回match对象
    • pattern re字符串或原生字符串表示
    • string 待匹配字符串
    • flags 使用时的控制标记
      • re.I re.IGNORECASE 忽略正则表达式中的大小写区分,[A-Z]能匹配小写字符
      • re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
      • re.S re.DOTALL 正则表达式中的.操作符能够匹配所有字符(包括换行符),默认匹配除换行符外的所有字符

         
  • re.match(pattern,string,flags=0) 从字符串开始位置起匹配re,返回match对象
    • pattern/string/flags同search

       
    • 起始位置不是邮政编码,返回空对象

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

       
  • re.split(pattern,string,maxsplit=0,flags=0) 将一个字符串按照re匹配结果进行分隔,返回列表类型
    • pattern/string/flags同search
    • maxsplit 最大分隔数,剩余部分作为最后一个元素输出

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

       
  • re.sub(pattern,repl,string,count=0,flags=0) 在一个字符串中替换所有匹配re的子串,返回替换后的字符串
    • pattern/string/flags同search
    • repl 替换字符串
    • count 最大替换次数

       

Re库的另一种等价用法

  • 函数式用法:一次性操作
    rst = re.search(r'[1-9]\d{5}','BIT 100081')
  • 面向对象用法:编译后的多次操作

     
  • regex = re.compile(pattern, flags=0) 返回正则表达式对象
    • 正则表达式对象或pattern对象是经过compile的返回对象
    • pattern 正则表达式字符串或原生字符串表示
    • flags 正则表达式使用时的控制标记
    • 方法与re方法对象,去除pattern参数:
      • regex.search()
      • regex.match()
      • regex.findall()
      • regex.split()
      • regex.finditer()
      • regex.sub()

Match对象

 

属性

属性 说明
.string 待匹配的文本
.re 匹配时使用的pattern对象
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

方法

方法 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串中的开始位置
.end() 匹配字符串在原始字符串中的结束位置
.span() 返回(.start(), .end())
  • Match对象包含的是第一次匹配的结果,若需要所有匹配对象,运用finditer()。

     

Re库的贪婪匹配和最小匹配

 

  • 有时存在多项匹配,PYAN,PYANBN,PYANBNCN,PYANBNCNDN
  • Re库默认采用贪婪匹配,即输出匹配最长的子串
  • 若需要最小匹配: >>> match = re.search(r'PY.*?N','PYANBNCNDN')

最小匹配操作符

  • *?, 与*类似,最小匹配
  • +?, 与+类似,最小匹配
  • ??, 与?类似,最小匹配
  • {m,n}?, 与{m,n}类似,最小匹配
  • 即在操作符后加?

Leave a Reply

Your email address will not be published.