正则表达式是一种描述性的语言,用来匹配字符串。凡是符合规则的字符串,我们认为就是匹配了。

正则表达式并非Python独有的,它与语言无关。很多语言都支持正则表达式。

我们经常用正则表达式来匹配电子邮件、手机号码、url等等。

来看一个简单的正则表达式,用于匹配手机号码:

^1[35789]\d{9}$

表示匹配以1开头,第二位是3或5或7或8或9,后面9位是数字,且后面必须以9位数字结尾。满足该规则的手机号就说明匹配该正则了。

Python里re模块包含所有正则表达式的功能。

注意:由于Python的字符串本身也用\转义,所以要特别注意:

s = 'ABC\\'
# 对应的正则表达式字符串变成:'ABC\'

使用Python的r前缀,就不用考虑转义的问题了:

s = r'ABC\'
# 对应的正则表达式字符串不变:'ABC\'

上面的正则用Python写则是:

import re

m = re.match(r'^1[35789]\d{9}$', '13271222223')
print(m) m = re.match(r'^1[35789]\d{9}$', '23271222223')
print(m)

输出:

<_sre.SRE_Match object; span=(0, 11), match='13271222223'>
None

发现第二个例子匹配结果是None。Python中re模块match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None

所以我们可以写如下判断代码:

import re

if re.match(r'^1[35789]\d{9}$', '13271222223'):
print('ok')
else:
print('not match')

输出:

ok

元字符

\d属于元字符。

常用的元字符:

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

重复

{9}属于重复限定符。

常用的限定符:

代码/语法 说明
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

字符类

[35789]表示匹配3或5或7或8或9中的某一个。像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。

[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。

使用正则切分字符串

re模块里的split可以代替常规的split。示例:

# coding: utf-8

import re

string = 'abc d  e'
print(string.split(' ')) print(re.split(r'\s+', string))

输出:

['abc', 'd', '', 'e']
['abc', 'd', 'e']

我们发现常规的切分字符串无法识别连续的空格,但正则可以。

分组

正则表达式还可以提取子串。用()表示的就是要提取的分组。

(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,可以按顺序分析:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})

import re

m = re.match(r'(\d{1,3}\.){3}\d{1,3}', '11.22.33.44')
print(m.group(0))
print(m.group(1)) print(m.groups())

输出:

11.22.33.44
33.
('33.',)

group(0)永远是原始字符串,group(1)group(2)……表示第1、2、……个子串。groups()返回所有子串的tuple。

这里由于只有一个分组,所以打印group(2)会报错。

贪婪匹配

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。

比如我们要匹配数字102300后面的0

import re

m = re.match(r'^(\d+)(0*)$', '102300')
print(m.groups())

输出:

('102300', '')

由于贪婪匹配,\d+会一直匹配到末尾,把整个数字都匹配了,0*就只能匹配空字符串了。我们改改:

import re

m = re.match(r'^(\d+?)(0*)$', '102300')
print(m.groups())

输出:

('1023', '00')

加个?就可以让\d+采用非贪婪匹配。

懒惰限定符:

代码/语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

正则表达式非常强大,本节只是讲解了基础。更多关于正则的知识,大家可以找资料学习。

参考:

1、正则表达式30分钟入门教程

http://deerchao.net/tutorials/regex/regex.htm

Python学习--16 正则表达式的更多相关文章

  1. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  2. Python学习 之 正则表达式

    1.简单的正则表达式 import re s=r'abc' re.findall(s,"aaaaaaaaaaaaaaa") #结果为[] re.findall(s,"ab ...

  3. Python学习笔记——正则表达式入门

    # 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...

  4. python学习日记(正则表达式)

    定义 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Pyth ...

  5. python学习笔记——正则表达式regex

    1 概述 1.1 定义 本质是由一系列字符和特殊符号组成的字串,用来表示一定规则的某一类字符串. 1.2 特点 正则表达式是一个独立的技术,其在多种编程语言中使用. 在python语言中的正则表达式模 ...

  6. python学习笔记----正则表达式

    正则: regular expression 常用的场景: #正则的包 >>> import re #match:开头匹配,匹配到,返回一个匹配对象,否则返回None >> ...

  7. python学习day25 正则表达式

    4.30-25 正则表达式与re模块 re模块本身是用来操作正则表达式,与正则本身没有关系 正则表达式是指一规则,匹配字符串的规则 1.正则表达式regex 正则表达式regex是指一规则,匹配字符串 ...

  8. Python学习 :正则表达式

    正则表达式 python 使用正则表达式(re)来进行匹配引擎搜索 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串” 关于正则表达式 ...

  9. python 学习总结----正则表达式

    正则表达式 应用场景 - 特定规律字符串的查找,切割,替换 - 邮箱格式:URl,IP地址等的校验 - 爬虫项目中,特定内容的提取 使用原则 - 只要使用字符串等函数能解决的问题,就不要使用正则 - ...

随机推荐

  1. Jquery 源码学习

    https://www.youtube.com/watch?v=qeMFEz_ufZc http://stackoverflow.com/questions/7194784/analysing-the ...

  2. php单元测试到底是什么东西呢?

    前言: 真正写php代码也有3年时间了,勉强算是一个php程序员, 但是,心底却一直没有底气. 都说测试驱动开发,可我连程序开发中什么是单元测试?这种基本的程序员的素养都 还不是很清楚,痛定思痛,决定 ...

  3. Unity3d 开发之 ulua 坑的总结

    相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 i ...

  4. jsoup -- xml文档解析

    jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...

  5. linux devel包 和 非devel包的区别

    devel 包主要是供开发用,至少包括以下2个东西: 1. 头文件 2. 链接库 有的还含有开发文档或演示代码. 以 glib 和 glib-devel 为例: 如果你安装基于 glib 开发的程序, ...

  6. JAVA基础--适配器模式

    interface Window{ // 定义Window接口,表示窗口操作 public void open() ; // 打开 public void close() ; // 关闭 public ...

  7. OSD的主要实现方法和类型(转)

    源:OSD的主要实现方法和类型 目前有两种主要的OSD实现方法:外部OSD发生器与视频处理器间的叠加合成;视频处理器内部 支持OSD,直接在视频缓存内部叠加OSD信息. 外部OSD发生器与视频处理器间 ...

  8. windows server 2012 AD 活动目录部署系列(七)Active Directory 的授权还原

    域内所有的域控制器都有一个内容相同的Active Directory,而且 Active Directory 的内容是动态平衡的,也就是说任何一个域控制器修改了 Active Directory,其他 ...

  9. APP被苹果APPStore拒绝的各种原因

    APP被苹果APPStore拒绝的各种原因 1.程序有重大bug,程序不能启动,或者中途退出.2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币.3.游戏里有实物奖励的话,一定要说清楚,奖励由本 ...

  10. UVA 11542 Square ——线性基

    [题目分析] 每个数没有超过500的因子.很容易想到把每一个数表示成一个二进制的数. (0代表该质数的次数为偶数,1代表是奇数) 然后问题转化成了选取一些二进制数,使他们的异或和为0. 高斯消元,2^ ...