Python编程中 re正则表达式模块 介绍与使用教程

一、前言:

这篇文章是因为昨天写了一篇 shell script 的文章,在文章中俺大量调用多媒体素材与网址引用。这样就会有一个问题就是:随着俺的技能的提高,需要类比的、引用的、整理的就会越来越多。这样会出现一个问题就是 针对 url 做一个全面的检查,保证所有链接读者都可以打开。嗯,就是这样的一个轮子。目前计划先是 **re模块找到url链接,requests 模块再进行源码爬取与判断 。后面再升级的话可以考虑修复链接的错误,更强可以再修复文档中各种错误(这些就是后话了)。为啥会写这篇文章呢?俺觉得网上很多人都是抄袭或没有实战经验,写的东西不容易懂也不容易被利用 **。正好现在俺在造轮子,那就参考参考权威资料和几位前辈的美文,动动手,写篇 re模块 的详细介绍。



二、介绍:

I、正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用**单个字符串来描述、匹配一系列匹配某个句法规则的字符串 **。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sedgrep)普及开的。——摘自维基百科

文字表达式全集 (番茄) 正则表达式语法(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正则表达式模块 介绍与使用教程的更多相关文章

  1. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  2. 简学Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  3. 【转载】Python编程中常用的12种基础知识总结

    Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...

  4. Python编程中常用的12种基础知识总结

    原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...

  5. 解析Python编程中的包结构

    解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...

  6. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  7. Python编程中NotImplementedError的使用

    Python编程中raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制.在面向对象编程中,可以先预留一个方法接口不实现,在其子类中实现.如果要求其子类一定要实现,不实现的时候会导致问题 ...

  8. Python学习笔记6-Python中re(正则表达式)模块学习

    今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...

  9. python之路8-内置模块介绍

    time & datetime模块 1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 6 7 # print(t ...

随机推荐

  1. Plugins in Unity

    [Plugins in Unity] In Unity, you normally use scripts to create functionality but you can also inclu ...

  2. C++——堆、栈、静态存储区

      栈 堆 静态存储区 生命周期 函数结束即释放 new,malloc开辟,delete,free释放 释放前,一直存在 最长,程序退出才释放   程序.局部变量 new,malloc申请的空间,用于 ...

  3. GitHub 上的十一款热门开源安全工具

    作为开源开发领域的基石,“所有漏洞皆属浅表”已经成为一条著名的原则甚至是信条.作为广为人知的Linus定律,当讨论开源模式在安全方面的优势时,开放代码能够提高项目漏洞检测效率的理论也被IT专业人士们所 ...

  4. 由浅到深理解ROS(5)- launch启动文件的理解与编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

  5. 特征工程 vs. 特征提取

    “特征工程”这个华丽的术语,它以尽可能容易地使模型达到良好性能的方式,来确保你的预测因子被编码到模型中.例如,如果你有一个日期字段作为一个预测因子,并且它在周末与平日的响应上有着很大的不同,那么以这种 ...

  6. css3的那些高级选择器二

    在上个星期我介绍了css3的属性选择器,伪类选择器和结构伪类选择器,今天楼主继续把其它的css3选择器说完. 在css3中,共有11中UI状态伪类选择器,分别是E:hover,E:active,E:f ...

  7. 前端技术俗语js

    注:原文是英文,本文是我翻译的.有人把我翻译的内容原文照抄,放到他自己的专栏,搞得有人问我是不是我抄袭了……请支持我的劳动成果,花了两个小时翻译的,谢谢.转载请注明译者为方应杭. 嘿,我最近接到一个 ...

  8. ubuntun16.0 登陆密码忘记

    1. 开机,如下图所示(没有装虚拟机,手机拍的图片凑合这看把): 2. 此时会有一个选项:Advanced Options for Ubuntu, 选中直接回车 ,如下图: 3. 看到里面有很多选项, ...

  9. 搭建IntelliJ IDEA授权服务

    废话不多,直接开始 下载IntelliJ IDEA授权服务软件v1.4 密码:mu3t 下载IntelliJ IDEA授权服务软件v1.3 密码:1odn 选择你自己服务器的版本,我这里选择Intel ...

  10. DLL用def定义文件来导出重载函数(转)

    动态链接库DLL_Sample.dll DLL_Sample.h:#ifdef TEST_API# define TEST_API _declspec(dllexport)#else# define ...