一、语法

1. 使用正则表达式进行匹配的流程

2. Python支持的正则表达式元字符和语法

参考:

AstralWind的Python正则表达式指南

官方文档:7.2. re — Regular expression operations

二、常用操作

1. 匹配

  1. >>> import re
  2. >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
  3. <_sre.SRE_Match object; span=(0, 9), match='010-12345'>
  4. >>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
  5. >>>

match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:

  1. test = '用户输入的字符串'
  2. if re.match(r'正则表达式', test):
  3. print('ok')
  4. else:
  5. print('failed')

2. 切分字符串

用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:

  1. >>> 'a b c'.split(' ')
  2. ['a', 'b', '', '', 'c']

嗯,无法识别连续的空格,用正则表达式试试:

  1. >>> re.split(r'\s+', 'a b c')
  2. ['a', 'b', 'c']

无论多少个空格都可以正常分割。加入,试试:

  1. >>> re.split(r'[\s\,]+', 'a,b, c d')
  2. ['a', 'b', 'c', 'd']

再加入;试试:

  1. >>> re.split(r'[\s\,\;]+', 'a,b;; c d')
  2. ['a', 'b', 'c', 'd']

如果用户输入了一组标签,下次记得用正则表达式来把不规范的输入转化成正确的数组。

3. 分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:

  1. >>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
  2. >>> m
  3. <_sre.SRE_Match object; span=(0, 9), match='010-12345'>
  4. >>> m.group(0)
  5. '010-12345'
  6. >>> m.group(1)
  7. ''
  8. >>> m.group(2)
  9. ''

如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。

注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。

提取子串非常有用。来看一个更凶残的例子:

  1. >>> t = '19:05:30'
  2. >>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
  3. >>> m.groups()
  4. ('', '', '')

这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期:

  1. '^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'

对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。

4. 贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

  1. >>> re.match(r'^(\d+)(0*)$', '').groups()
  2. ('', '')

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

  1. >>> re.match(r'^(\d+?)(0*)$', '').groups()
  2. ('', '')

5. 编译

当我们在Python中使用正则表达式时,re模块内部会干两件事情:

编译正则表达式,如果正则表达式的字符串本身不合法,会报错;

用编译后的正则表达式去匹配字符串。

如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:

  1. >>> import re
  2. # 编译:
  3. >>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
  4. # 使用:
  5. >>> re_telephone.match('010-12345').groups()
  6. ('', '')
  7. >>> re_telephone.match('010-8086').groups()
  8. ('', '')

编译后生成Regular Expression对象,由于该对象自己包含了正则表达式,所以调用对应的方法时不用给出正则字符串。

详细参考:

正则表达式 - 廖雪峰的官方网站

三、其它样例

1. 根据指定字符进行字符串切割

下面的语句先是将中文标点符号替换为指定的标记符号('\3'),然后根据该标记符号切割字符串;其它类型字符的处理方式类似

  1. dialog = re.sub(u',|。|?|!', '\3', dialog).split('\3')

因为是中文字符,这里的u表示unicode编码

2. 只保留单词和数字字符

  1. res = re.sub(r"_|\W", "", s).lower()

3. 验证Email地址

  1. import re
  2.  
  3. def is_valid_email(addr):
  4. """ 验证Email地址 """
  5. return True if re.match(r"^[0-9a-zA-Z.]+@[0-9a-zA-Z]+.com", addr) else False
  6.  
  7. assert is_valid_email('someone@gmail.com')
  8. assert is_valid_email('bill.gates@microsoft.com')
  9. assert not is_valid_email('bob#example.com')
  10. assert not is_valid_email('mr-bob@example.com')
  11. print('ok')

4. 提取出带名字的Email地址

  1. import re
  2.  
  3. def name_of_email(addr):
  4. """ 提取出带名字的Email地址 """
  5. return re.match(r"^<?(\w+\s?\w+)>?.*@\w+.\w{3}", addr).group(1)
  6.  
  7. assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
  8. assert name_of_email('tom@voyager.org') == 'tom'
  9. print('ok')

[Python] re正则表达式指南以及常用操作的更多相关文章

  1. python学习二,字符串常用操作

    字符串可以说是在日常开发中应用最广泛的了,现在来总结下有关python中有关字符串一些常用操作 首先我们声明一个字符串变量 str = "hello world" 下面我们来依次介 ...

  2. Python脚本控制的WebDriver 常用操作 <二> 关闭浏览器

    下面将模拟一个WebDriver关闭浏览器的操作 测试用例场景 在一个自动化测试脚本运行完毕后,我们很可能会采取关闭浏览器的操作,而关闭浏览器的常用操作有如下两种: close quit close  ...

  3. Python脚本控制的WebDriver 常用操作 <一> 启动浏览器

    由于本人的学习定位是基于Selenium+WebDriver+Python+FireFox+Eclipse+Pydev, 所以我的笔记也只和这方面相关. 我打算先学习基于Python脚本WebDriv ...

  4. python的字典数据类型及常用操作

    字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1: value1, key2: value2} 1.键与值用冒号“:”分开: 2.项与项用逗号“,”分开: 特性: 1.ke ...

  5. python的列表数据类型及常用操作

    列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表可以进行的操作包括索 ...

  6. Python中字符串有哪些常用操作?纯干货超详细

  7. Python脚本控制的WebDriver 常用操作 <十一> 操作测试对象

    下面将使用WebDriver来模拟键盘的输入操作,以及复习上节的层对象操作 测试用例场景 定位到具体的对象后,我们就可以对这个对象进行具体的操作,比如先前已经看到过的点击操作(click).一般来说, ...

  8. Python脚本控制的WebDriver 常用操作 <八> 简单的对象定位

    这一部分的内容,将是在WebDriver中,定位元素方法的演示,是将Selenium中Selenese元素定位命令的WebDriver中使用方法的结合 Selenium中元素定位方法复习可以参考: & ...

  9. Python脚本控制的WebDriver 常用操作 <十二> send_keys模拟按键输入

    下面将使用WebDriver中的send_keys来模拟键盘按键输入 测试用例场景 send_keys方法可以模拟一些组合键操作: ctrl+a ctrl+c ctrl+v 等. 另外有时候我们需要在 ...

随机推荐

  1. ubuntu如何释放内存

    答: step 1: 以最高权限同步所有的缓存到磁盘中 sync sync step2: 执行以下命令指示内核对内存进行调整 echo 3 > /proc/sys/vm/drop_caches ...

  2. valid 校验方式

    校验参数方法:1.最简单的方式是,使用Java bean注解校验(如 @NotEmpty...)2.适合复杂点的自定义校验(推荐) 2.1 先定义一个校验接口: public interface Va ...

  3. Mixed Authentication in IIS7

    Process for Mixed Authentication Configuration in IIS7 Integration Mode There're some breaking chang ...

  4. 【bzoj1369】[Baltic2003]Gem(树形dp+结论)

    题目传送门:bzoj1369 这题其实有个结论:节点数为n的树,对其染色使相邻节点颜色不同,且总颜色权值最小,所需的颜色数量是$ O(\log n) $的. 所以我们就可以愉快的dp了:$ f[i][ ...

  5. P4开源Tutorials教程样例实战及对P4v1.1规范的初分析

    Github链接:Github-P4Lang-Tutorials-p4v1.1 前言 本文主要对Barefoot开源教程中的p4v1.1实例simple_router的实战步骤进行记录与阐述,希望能帮 ...

  6. shell统计各省的百强县

    原始数据在最后 baiqiang.txt文件中 shell命令: cat baiqiang.txt | grep -P "^国|^☆" | awk -F" " ...

  7. 聚类算法——MCL

    最近在看聚类方面的论文,接触到了MCL聚类,在网上找了许久,没什么中文的资料,可能写的最具体的便是GatsbyNewton写的 马尔可夫聚类算法(MCL) 这篇博客了.但是,其中仍有一些不详细的地方. ...

  8. [Vue]使用 vue-i18n 切换中英文

    1.引入 vue-i18n  import Vue from 'vue' import VueI18n from 'vue-i18n' import merge from 'lodash/merge' ...

  9. 分享海量 iOS 及 Mac 开源项目和学习资料

    UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITable ...

  10. 通用Mapper相关

    1.通用Mapper中,用@Table来映数据表与实体,其中 name:指定表的名称,例如@Table(name="ls_post") catalog: 指定数据库名称,默认为当前 ...