题记

本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。

正则表达式在很多的应用中都有使用到,特别是在网络爬虫中格式化html后取出自己需要的属性,在字符串的匹配和查找中也有很多的应用。

本文主要使用python对正则表达式进行说明,并配合合适的代码。

如何匹配手机号码

正则表达式的规则,一开始看的时候,会感觉规则太多太乱,毫无规律可寻,看完了几个例子以后,慢慢的发现一些常用的表达式以后,写起后面的规则就容易得多了。

这里以如何匹配手机电话号码为例子

最简单的手机规律为11个数字,正则表达式为:

\d{11}

这样我们就认为凡事字符串中有11位数字就认为是手机号码,但是现实中还有另外一些规则,12345678912这也是11个数字,但是我们现在并不会认为他是手机号码,所以进一步的把规则写细了。

我们还可以进一步的细分为,13x开头,14x开头,17(13678)开头,18x开头,后面再带8位的数字,还有另一种情况是170的情况,其中第四位为[0589]中的一个数,再带7位数字。

表达式可以写为:

(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

正则表达式语法

我们刚才用到的\d 在正则表达式中,代表着数字的意思,还可以用[0-9]来表示一个数字。语法比较多,但是常用的并不是很多,图中表示的是常见的语法。

字符串匹配:

语法 含义
\d 数字
\D 非数字
\s 空白符
\S 非空白符
\w 单词字符
\W 非单词字符

数量匹配:

语法 含义
* 匹配前面字符0次到无限次
+ 匹配前面字符1次到无限次
匹配前面字符0到1次
{m} 匹配前面字符m次
{m,n} 匹配前面字符m到n次

匹配边界:

语法 含义
^ 匹配字符串开头
$ 匹配字符串末尾

图中的表达式都有专门的例子介绍,可以大概的看看,需要用到的时候在专门来进行查询。

python中的re模块

在python中,有专门的模块来负责正则表达式,就是re模块。

字符串是否匹配规则

比如在用户注册里,我们要求用户输入的手机号码,符合手机号码的规律,可以用正则表达式来限制。

查看字符串中

是否有符合要求的字符串,还是以刚才的手机号码为例:

import re
str = '15259340987'
# 将正则表达式编译成Pattern对象
pattern = re.compile('152\d{8}')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match(str)
if match:
# 使用Match获得分组信息
print match.group()

这里可以看出正则表达式,用的是

re.compile('152\d{8}')

这个表达式比

(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

是严格非常多的,他只匹配,152开头的手机号码,当然表达式可以根据你自己的需要来选择,这里只是给一个实例。

找出所有符合规则的字符串

在网页爬虫中,我们需要找出网页的说有链接,用正则匹配就非常容易做到,查看网页源代码中的html,带有网页链接的代码为

href="http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml"

正则表达式可以写成:

href="(.*?)"

python代码为:

import re
str = 'href="http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml"'
# 匹配
links = re.findall('href="(.*?)"', str) for link in links:
print link # 输出为:
# http://tech.sina.com.cn/t/2017-08-17/doc-ifykcppx8531845.shtml

找出了所有需要的链接。

re模块中重要的接口

  • re.compile(pattern, flags=0)

    这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。

    语句

    prog = re.compile(pattern)

    result = prog.match(string)

    result = re.match(pattern, string)

    等价,第二种写法较为方便。

  • re.search(pattern, string, flags=0)

    这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。

    pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

  • re.match(pattern, string, flags=0)

    这个方法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。

    pos和endpos的默认值分别为0和len(string);re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

    注意:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。

  • re.split(pattern, string, maxsplit=0, flags=0)

    按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。

  • re.findall(pattern, string, flags=0)

    搜索string,以列表形式返回全部能匹配的子串。

  • re.sub(pattern, repl, string, count=0, flags=0)

    使用repl替换string中每一个匹配的子串后返回替换后的字符串。

    当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。

    当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。

    count用于指定最多替换次数,不指定时全部替换。

常用的正则表达式语句

  • 匹配邮箱:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}

  • 匹配中文:[\u4e00-\u9fa5]

  • 匹配IP(IPV4):(\d+).(\d+).(\d+).(\d+)

  • 匹配身份证:\d{15}|\d{17}[0-9Xx]

  • 匹配手机号:(13\d|14[57]|15[^4,\D]|17[13678]|18\d)\d{8}|170[0589]\d{7}

正则表达式工具

正则表达式语法比较复杂,开始没有经验的话,调试起来比较麻烦,现在网上有很多的正则表达式工具,能帮助我们快速的进行试验。有客户端的工具也有web工具,用起来都较为方便。

用的较多的是RegexBuddy这一款工具,如图,他可以自动的生成各种语言版本的正则表达式的例子:

如下

更多入门教程可以参考:[http://www.bugingcode.com/python_start/] (http://www.bugingcode.com/python_start/)

正则表达式入门-python代码的更多相关文章

  1. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  2. 转载 Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写.转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式 ...

  3. python正则表达式入门篇

    文章来源于:https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. ...

  4. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  5. 千行代码入门Python

    这个是从网上找到的一份快速入门python的极简教程,大概一千行左右,个人觉得不错,特此收藏以备后用. # _*_ coding: utf-8 _*_ """类型和运算- ...

  6. 转载 Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  7. Python 入门之代码块、小数据池 与 深浅拷贝

    Python 入门之代码块.小数据池 与 深浅拷贝 1.代码块 (1)一个py文件,一个函数,一个模块,终端中的每一行都是代码块 (代码块是防止我们频繁的开空间降低效率设计的,当我们定一个变量需要开辟 ...

  8. 常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)

    大家好,我是辰哥~ 本文带大家学习正则表达式,并通过python代码举例讲解常用的正则表达式 最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析. 正则表达式语法 Python的re模块( ...

  9. Python入门2(Python与C语言语法的不同、Notepad++运行Python代码)

    本篇博客主要介绍Python的基本语法与C语言不同的地方 [不同] 一.Python代码需要有严格的缩进,即C语言中所谓的良好的编码习惯.缩进不正确就会报错. 二.C语言需要圆括号 三.C语言每个语句 ...

随机推荐

  1. [NOI2014]魔法森林(LCT)

    蒟蒻又发现自己还没写过LCT…… 首先显然按照权值a从小到大排序,维护b的最小生成树.然后直接扫,代价是加入b的最大值,然后动态加边,因为有边权,所以在lct中边应该理解为点.每次连接(u,v)时,若 ...

  2. Mybatis入门——基础方式的增删该查、mapper动态代理方式的CRUD、类型转换器

    一.基础方式的增删该查: 1.mybatis约定:输入参数parameterType和输出参数resulrType在形式上只能有一个. 2.如果输入/输出参数:是简单类型(8个基本类型加String) ...

  3. 写入简单的日志log

    log.c: #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  4. Iterator模式

    Iterator英文意思是重复做某件事,中文翻译为迭代器,这个设计模式中主要有Iterator(迭代器),ConcreteIterator(具体的迭代器),Aggergate(集合),Concrete ...

  5. 二十四、SSH介绍

    1.ssh介绍: SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输,确保了传递的数据安全.(运维的一大重视点就是要对安全敏感) 在当前的生产环境运维工作中,绝大多数企业都是SSH协议 ...

  6. java代码实现数据源切换(连接池简单粗暴)

    --最佳实践配置(.yml) gs.oracle: #driverClassName: oracle.jdbc.driver.OracleDriver driverClassName: oracle. ...

  7. python学习笔记(13)常用模块列表总结

    os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作 ...

  8. Python迭代器和关键字 global ,nonlocal

    1.关键字 global : 可以修改全局变量 可以在局部作用域声明一个全局变量,剪切 : 此时局部作用域没有该变量,全局作用域中有 name = 1 def func(): global name ...

  9. 3dmax2019卸载/安装失败/如何彻底卸载清除干净3dmax2019注册表和文件的方法

    3dmax2019提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2019失败提示3dmax2019安装未完成,某些产品无法安装,也有时候想重新安装3 ...

  10. STL:map中的lower_bound和upper_bound

    今天在做leetcode的Longest Increasing Subsequence题目时,需要用到二分查找,于是翻看了<STL源码剖析>这本书,发现map里面有lower_bound和 ...