详解Python 正则表达式模块


Posted in Python onNovember 05, 2018

由于最近需要使用爬虫爬取数据进行测试,所以开始了爬虫的填坑之旅,那么首先就是先系统的学习下关于正则相关的知识啦。所以将下面正则方面的知识点做了个整理。语言环境为Python。主要讲解下Python的Re模块。

下面的语法我就主要列出一部分,剩下的在python官网直接查阅即可: docs.python.org/3/library/r…

一、基础语法总结

1.1、匹配单个字符

a . \d \D \w \W \s \S [...] [^...]

匹配单个字符(.)

规则:匹配除换行之外的任意字符

In [24]: re.findall("f.o","foo is not fao")
Out[24]: ['foo', 'fao']

匹配任意(非)数字字符(\d \D)

\d   [0-9]
\D   [^0-9]

匹配任意(非)普通字符(\w \W)

\w 普通字符 包括[_0-9A-Za-z] 同时也包括汉字
\W 非普通字符

匹配任意(非)空字符(\s \S)

\s 匹配任意空字符  [\r\n\t]
\S 匹配任意非空字符

匹配字符集合([...])

[A-Z][a-z][0-9][_123a-z]

匹配字符集([^...])

规则:字符集取非,除列出的字符之外的任意一个字符

[^abc] --> 除a b c之外任意字符

1.2、匹配多个字符

* 匹配0次或者多次
+ 匹配1次或者多次
? 匹配0次或者1次
{m} 匹配m次
{m,n} 匹配m次到n次区间内的任意一次

1.3、匹配位置

^ 匹配开始位置
$ 匹配结束位置
\A 匹配开始位置
\Z 匹配结束位置
\b 匹配单词边界位置(一般用于首字母大写的匹配)
\B 匹配非单词边界问题

1.4、转义

在正则表达式中有一类特殊字符需要转移,只需要在特殊字符之间加上 \ 表示转移即可

. * + ? ^ $ [] {} () | \

1.5、子组

使用() 可以为正则表达式建立内部分组,子组为正则表达式的一部分,可以看做一个内部整体。

In [61]: re.search(r"(https|http|ftp):\/\/\w+\.\w+\.(com|cn)","https://www.baidu.com").group(0)
Out[61]: 'https://www.baidu.com'
In [62]: re.search(r"(https|http|ftp):\/\/\w+\.\w+\.(com|cn)","https://www.baidu.com").group(1)
Out[62]: 'https'

1.6、贪婪模式和非贪婪模式

正则表达式的重复匹配总是尽可能多的向后匹配更多的内容。 贪婪模式包括:* + ? {m,n}

非贪婪模式:尽可能少的匹配内容 贪婪模式转换为非贪婪模式:*? +? ?? {m,n}?

In [106]: re.findall(r"ab+?","abbbbbbbb")
Out[106]: ['ab']
In [107]: re.findall(r"ab??","abbbbbbbb")
Out[107]: ['a']

二、Re模块

详解Python 正则表达式模块

接下来我所有函数里面的参数解释如下:

pattern:正则表达式
string:目标字符串
pos:截取目标字符串起始位置
endpose:截取目标字符串结束位置
flags:功能标志
replaceStr:替换的字符串
max:最多替换几处(默认替换全部)

有上图我们看出来,接下来我们要将的Python中re模块、regex对象、match对象三者之间是存在一定关系的。

1、re模块的compile方法返回一个regex对象
2、re模块和regex对象的finditer()、fullmatch()、match()、search()等方法返回一个match对象
3、他们分别有自己的属性和方法

2.1、compile

regex = re.compile(pattern, flags = 0) # 生成正则表达式对象

2.2、findall

re.findall(pattern,string,pos,endpose) # 从目标字符串中匹配所有符合条件的内容

2.3、split

re.split(pattern,string,flags) #根据正则表达式对目标字符串进行分割

In [79]: re.split(r'\s+',"Hello World")
Out[79]: ['Hello', 'World']

2.4、sub

re.sub(pattern,replaceStr,string,max,flags)

In [80]: re.sub(r'\s+',"##","hello world")
Out[80]: 'hello##world'

2.5、subn

re.subn(pattern,replaceStr,string,max,flags)  #功能同sub,但是返回值返回替换后的字符串和替换了几处

In [80]: re.sub(r'\s+',"##","hello world")
Out[80]: ('hello##world',1)

2.6、finditer

re.finditer(pattern,string)  #使用正则表达式匹配目标字符串,返回一个match对象,match对象调用group()之后才能拿到值

In [87]: it = re.finditer(r'\d+',"2014nianshiqiqngduo 08aoyun 512dizhen")

In [88]: for i in it:
 ....: print(i)
 ....: 
<_sre.SRE_Match object at 0x7f0639767920>
<_sre.SRE_Match object at 0x7f0639767ac0>
<_sre.SRE_Match object at 0x7f0639767920>
In [93]: it = re.finditer(r'\d+',"2014nianshiqiqngduo 08aoyun 512dizhen")
In [94]: for i in it:
 ....: print(i.group())
 ....: 
2014
08
512

2.7、fullmatch

fullmatch(pattern,string,flags) #完全匹配目标字符串,相当于加了^ 和 $

2.8、match

re.match(pattern,string,flags)  #匹配目标字符串开头的位置

2.9、search

re.search(pattern,string,flags) #  正则表达式匹配目标字符串,只匹配第一处

三、一些练习题

3.1、匹配首字母大写的单词

import re
f = open('test.txt')
pattern= r'\b[A-Z][a-zA-Z]*\s*'
# pattern= r'\b[A-Z]\S'
L = []
for i in f:
 L += re.findall(pattern,i)
print(L)

test.txt文档内容如下:

Hello World -12.6
Nihao 123
How are you -12
1.24
asdk 34%,
占比 1/2
2003 - 2005./%

3.2、匹配数字(正数、负数、小数、百分数、分数)

import re
pattern = "-?\d+((/?\d+)|((\.)?\d+)|((\%)?))"
f = open('test.txt')
l = []
for line in f:
 l += re.finditer(pattern,line)
for i in l:
 print(i.group())

总结

以上所述是小编给大家介绍的Python 正则表达式模块,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
Python中的sort()方法使用基础教程
Jan 08 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
Python中psutil的介绍与用法
May 02 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
python新式类和经典类的区别实例分析
Mar 23 Python
如何在Python中创建二叉树
Mar 30 Python
Python基础之条件语句详解
Jun 16 Python
用python3教你任意Html主内容提取功能
Nov 05 #Python
用Python实现读写锁的示例代码
Nov 05 #Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 #Python
详解Python下Flask-ApScheduler快速指南
Nov 04 #Python
Python中修改字符串的四种方法
Nov 02 #Python
Python中flatten( )函数及函数用法详解
Nov 02 #Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
Nov 01 #Python
You might like
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
详解Vue之计算属性
2020/06/20 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
python 拼接文件路径的方法
2018/10/23 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
2019/08/17 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
给校长的一封建议书
2014/03/12 职场文书
保护野生动物倡议书
2014/05/16 职场文书
求职自我评价范文
2015/03/09 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB