Python编程中 re正则表达式模块 介绍与使用教程
Python编程中 re正则表达式模块 介绍与使用教程
一、前言:
这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用。这样就会有一个问题就是:随着俺的技能的提高,需要类比的、引用的、整理的就会越来越多。这样会出现一个问题就是 针对 url 做一个全面的检查,保证所有链接读者都可以打开。嗯,就是这样的一个轮子。目前计划先是 **re模块找到url链接,requests 模块再进行源码爬取与判断 。后面再升级的话可以考虑修复链接的错误,更强可以再修复文档中各种错误(这些就是后话了)。为啥会写这篇文章呢?俺觉得网上很多人都是抄袭或没有实战经验,写的东西不容易懂也不容易被利用 **。正好现在俺在造轮子,那就参考参考权威资料和几位前辈的美文,动动手,写篇 re模块 的详细介绍。
二、介绍:
I、正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用**单个字符串来描述、匹配一系列匹配某个句法规则的字符串 **。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。——摘自维基百科
文字表达式全集 (番茄) 正则表达式语法(IBM) 图片表达式全集 Regular Expression Syntax
II、re 模块
This module provides regular expression matching operations similar to those found in Perl. ——摘自官方手册
Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用这一内嵌于 Python 的语言工具,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。Python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。——摘自IBM
In [9]: print(str(len(re.__all__))+" 个子模块")
27 个子模块
In [10]: print(re.__all__)
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
三、约定:
1、反斜杠
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
2、匹配模式
re 所定义的 flag 包括:
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为’ . ’并且包括换行符在内的任意字符(’ . ’不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和’ # ’后面的注释
3、条件返回值
In [30]: a='afoaisfoasnfo'
In [31]: if re.match(r'[a-z]*',a):
...: print('It\'s Ture')
...:
It's Ture
四、使用:
I、re.compile
将正则表达式(以字符串书写的)转换为模式对象,供 match() 和 search() 这两个函数使用,可以实现更有效率的匹配。
re.compile(pattern[, flags])
# 如果在调用 match 或 search 函数时,使用字符串表示的正则表达式,它们会在内部将字符串转换成正则表示式对象。但是如果使用了compile 进行一次转换之后,在每次使用模式的时候就不需要再次进行转换。(没有特殊情况基本不用会比较麻烦)
# 例:以下两种用法结果相同:
# A)
compiled_pattern = re.compile(pattern)
result = compiled_pattern.match(string)
# B)
result = re.match(pattern, string)
II、re.search
在字符串中查找匹配正则表达式模式的位置,**一旦找到子字符串 **返回 MatchObject 的实例(值为True),否则返回 None(值为False)。
re.search(pattern, string[, flags])
# 例:以下代码为俺的半成品项目
def Regular_expression(self):
with open(self.doc_location.encode('utf-8')) as doc_files:
return re.search(r'(ht|f)(tp+)(s?)(://)[a-zA-Z0-9\.]+(?#url)(:[0-9]+)*(?#port)(/)',doc_files.read())
# 千万注意,search() 函数是扫描整个字符串来查找匹配。一旦使用了 re.search 找到了第一个符合的字符串会立刻停止查找。
III、re.march
从字符串开头位置开始匹配正则表达式,match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况。
re.match(pattern, string[, flags])
# 如果想要搜索整个字符串来寻找匹配,应当用 search()。
# 例:
In [79]: if re.match('a','www.python.org')==None: print('Match False')
Match False
In [80]: if re.match('w','www.python.org')==None: print('Match False')
In [81]: if re.match('ww','www.python.org')==None: print('Match False')
IIII、re.split
可以将字符串匹配正则表达式的匹配项来切割字符串并返回一个列表。
re.split(pattern, string[, maxsplit=0, flags=0])
In [85]: modleText='this is the test'
In [86]: print(modleText.split(' '))
['this', 'is', 'the', 'test']
In [87]: print(re.split(' ',modleText))
['this', 'is', 'the', 'test']
V、re.findall
在字符串中找到正则表达式所匹配的所有子串,返回给定模式的所有匹配项并组成一个列表返回。
re.findall(pattern, string[, flags])
# 实例1
def Regular_expression(self):
with open(self.doc_location.encode('utf-8')) as doc_files:
return re.findall(r'(ht|f)(tp+)(s?)(://)[a-zA-Z0-9\.]+(?#url)(:[0-9]+)*(?#port)(/)',doc_files.read())
> python lsurl.py
Please Input The Path About Documents: c:\users\rabbit\Desktop\example.txt
[('ht', 'tp', '', '://', '', '/'), ('ht', 'tp', 's', '://', ':2121', '/')]
# 实例2(给正则加上了括号)
def Regular_expression(self):
with open(self.doc_location.encode('utf-8')) as doc_files:
return re.findall(r'((ht|f)(tp+)(s?)(://)[a-zA-Z0-9\.]+(?#url)(:[0-9]+)*(?#port)(/))',doc_files.read())
> python lsurl.py
Please Input The Path About Documents: c:\users\rabbit\Desktop\example.txt
[('http://c.example.net/', 'ht', 'tp', '', '://', '', '/'), ('https://ira.be.me:2121/', 'ht', 'tp', 's', '://',
:2121', '/')]
VI、re.sub
使用给定的替换内容将匹配模式的字符串替换掉。在字符串 string 中找到匹配正则表达式 pattern 的所有子串,用另一个字符串 repl 进行替换。如果没有找到匹配 pattern 的串,则返回未被修改的 string。repl 既可以是字符串也可以是一个函数。
re.sub(pattern, repl, string[, count, flags])
In [91]: help(re.sub)
Help on function sub in module re:
sub(pattern, repl, string, count=0, flags=0)
Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl. repl can be either a string or a callable;
if a string, backslash escapes in it are processed. If it is
a callable, it's passed the match object and must return
a replacement string to be used.
In [92]: re.sub('(is|this)','sub','this is contect')
Out[92]: 'sub sub contect'
In [93]: re.sub('(is|this)','sub','this is contect',count=1)
Out[93]: 'sub is contect'
----------------
In [94]: p = re.compile( '(one|two|three)')
In [95]: p.sub( 'num', 'one word two words three words')
Out[95]: 'num word num words num words'
In [96]: p.subn( 'num', 'one word two words three words')
# 该函数的功能和 sub() 相同,但它还返回新的字符串以及替换的次数。
Out[96]: ('num word num words num words', 3)
VII、re.escape
它可以对字符串中所有可能被解释为正则运算符的字符进行转义的应用函数。
re.escape(pattern)
In [99]: re.escape('https://cdn.itxdm.com')
Out[99]: 'https\\:\\/\\/irabe\\.me'
In [100]: re.escape('https://www.itxdm.com')
Out[100]: 'https\\:\\/\\/www\\.itxdm\\.com'
相关主题:
引用维基百科:https://zh.wikipedia.org/wiki/正则表达式/
参考IBM一文:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonre/index.html
参考 "Python基础教程" 一书
推荐后续阅读1:https://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
推荐后续阅读2:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonre/index.html
Python编程中 re正则表达式模块 介绍与使用教程的更多相关文章
- Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- 简学Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- 【转载】Python编程中常用的12种基础知识总结
Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...
- Python编程中常用的12种基础知识总结
原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...
- 解析Python编程中的包结构
解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...
- 详解Python编程中基本的数学计算使用
详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...
- Python编程中NotImplementedError的使用
Python编程中raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制.在面向对象编程中,可以先预留一个方法接口不实现,在其子类中实现.如果要求其子类一定要实现,不实现的时候会导致问题 ...
- Python学习笔记6-Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- python之路8-内置模块介绍
time & datetime模块 1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 6 7 # print(t ...
随机推荐
- Apache Hive (四)Hive的连接3种连接方式
转自:https://www.cnblogs.com/qingyunzong/p/8715925.html 一.CLI连接 进入到 bin 目录下,直接输入命令: [hadoop@hadoop3 ~] ...
- 第五章 大数据平台与技术 第12讲 大数据处理平台Spark
Spark支持多种的编程语言 对比scala和Java编程上节课的计数程序.相比之下,scala简洁明了. Hadoop的IO开销大导致了延迟高,也就是说任务和任务之间涉及到I/O操作.前一个任务完成 ...
- 每个内存大小:sudo dmidecode -t memory |grep -A16 "Memory Device$" |grep "Size:"
CPU: 型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}' 数量:lscpu |grep "CPU ...
- hive单节点数据倾斜解决方法
一.现象 map/reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百 ...
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读
上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...
- [C++] * Basic and Class
C++ 目 录 1 开始学习C++ 4 1.1 C++的头文件 4 1.2 命名空间 4 1.3 更严格的类型转化 4 1.4 new和delete 4 1.5 内联函数 4 1.6 引用 5 1. ...
- Python监控日志程序-乾颐堂
一个简易的日志监控的脚本,功能如下:1.windows环境2.当匹配日志关键字时会发出声音,匹配的关键字不同,播放的声音不同3.能做到实时响应 注意:是在win环境下哦 直接上代码吧 1 2 3 4 ...
- htaccess跨域
目的:为了加快访问速度,减轻主站压力,把静态资源放到独立的服务器上,使用独立的域名 问题:浏览器为安全考虑,实施同源策略:ip/域名和端口必须相同 解决办法: 1.httpd.conf中,开启apac ...
- [GO]接口的定义和实现
package main import "fmt" type Humaner interface { SayHi() } type Student struct { name st ...
- BZOJ 2038 小Z的袜子(hose) (莫队算法)
题意:中文题. 析:很著名的莫队算法,先把这个求概率的式子表达出来,应该是分子:C(x1, 2) + C(x2, 2) + C(x3, 2) + ... + C(xn, 2) 分母:C(n, 2), ...