详解 Python3 正则表达式(二)
本文翻译自:https://docs.python.org/3.4/howto/regex.html
博主对此做了一些批注和修改 ^_^
使用正则表达式
现在我们开始来写一些简单的正则表达式吧。Python 通过 re 模块为正则表达式引擎提供一个接口,同时允许你将正则表达式编译成模式对象,并用它们来进行匹配。
批注:re 模块是使用 C 语言编写,所以效率比你用普通的字符串方法要高得多;将正则表达式进行编译(compile)也是为了进一步提高效率;后边我们会经常提到 “模式”,指的就是正则表达式被编译成的模式对象。
编译正则表达式
正则表达式被编译为模式对象,该对象拥有各种方法供你操作字符串,如查找模式匹配或者执行字符串替换。
re.compile() 也可以接受 flags 参数,用于开启各种特殊功能和语法变化,我们会在后边一一介绍。
现在我们先来看个简单的例子:
正则表达式作为一个字符串参数传给 re.compile() 。由于正则表达式并不是 Python 的核心部分,因此没有为它提供特殊的语法支持,所以正则表达式只能以字符串的形式表示。有些应用根本就不需要使用到正则表达式,所以 Python 社区的小伙伴们认为没有必要将其纳入 Python 的核心。相反,re 模块仅仅是作为 C 扩展模块包含在 Python 中,就像 socket 模块和 zlib 模块。
使用字符串来表示正则表达式保持了 Python 简洁的一贯风格,但也因此有一些负面影响,下边我们来谈一谈。
麻烦的反斜杠
上一篇中我们已经提到了,正则表达式使用 '\' 字符来使得一些普通的字符拥有特殊的能力(例如 \d 表示匹配任何十进制数字),或者剥夺一些特殊字符的能力(例如 \[ 表示匹配左括号 '[')。这会跟 Python 字符串中实现相同功能的字符发生冲突。
批注:挺拗口,接着看例子你就懂了~
现在的情况是,你需要在 LaTeX 文件中使用正则表达式匹配字符串 '\section' 。因为反斜杠作为需要匹配的特殊字符,所以你需要在它前边多加一个反斜杠来剥夺它的特殊功能。所以我们会把正则表达式的字符写成 '\\section' 。
但不要忘了,Python 在字符串同样使用反斜杠来表示特殊意义。因此,如果我们想将 '\\section' 完整地传给 re.compile(),我们需要再次添加两个反斜杠 ......
匹配字符 | 匹配阶段 |
\section | 需要匹配的字符串 |
\\section | 正则表达式使用 '\\' 表示匹配字符 '\' |
\\\\section | 不巧,Python 字符串也使用 '\\' 表示字符 '\' |
简而言之,为了匹配反斜杠这个字符,我们需要在字符串中使用四个反斜杠才行。所以,在正则表达式中频繁地使用反斜杠,会造成反斜杠风暴,进而导致你的字符串极其难懂。
解决方法是使用 Python 的原始字符串来表示正则表达式(就是在字符串前边加上 r,大家还记得吧 ... ):
正则字符串 | 原始字符串 |
“ab*” | r"ab*" |
"\\\\section" | r"\\section" |
"\\w+\\s+\\1" | r"\w+\s+\1" |
批注:强烈建议使用原始字符串来表达正则表达式。
实现匹配
当你将正则表达式编译之后,你就得到一个模式对象。那你拿它可以做什么呢?模式对象拥有很多方法和属性,我们下边列举最重要的几个来讲:
方法 | 功能 |
match() | 判断一个正则表达式是否从开始处匹配一个字符串 |
search() | 遍历字符串,找到正则表达式匹配的第一个位置 |
findall() | 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回 |
finditer() | 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回 |
如果没有找到任何匹配的话,match() 和 search() 会返回 None;如果匹配成功,则会返回一个匹配对象(match object),包含所有匹配的信息:例如从哪儿开始,到哪儿结束,匹配的子字符串等等。
接下来我们一步步讲解:
现在,你可以尝试使用正则表达式 [a-z]+ 去匹配各种字符串。
例如:
因为 + 表示匹配一次或者多次,所以空字符串不能被匹配。因此,match() 返回 None。
我们再尝试一个可以匹配的字符串:
在这个例子中,match() 返回一个匹配对象,我们将其存放在变量 m 中,以便日后使用。
接下来我们来看看匹配对象里边有哪些信息吧。匹配对象包含了很多方法和属性,以下几个是最重要的:
方法 | 功能 |
group() | 返回匹配的字符串 |
start() | 返回匹配的开始位置 |
end() | 返回匹配的结束位置 |
span() | 返回一个元组表示匹配位置(开始,结束) |
大家看:
由于 match() 只检查正则表达式是否在字符串的起始位置匹配,所以 start() 总是返回 0 。
然而,search() 方法可就不一样咯:
在实际应用中,最常用的方法是将匹配对象存放在一个局部变量中,并检查其返回值是否为 None 。
形式通常如下:
p = re.compile(...)
m = p.match('String goes here')
if m:
print('Match found:', m.group())
else:
print('No match')
有两个方法可以返回所有的匹配结果,一个是 findall(),一个是 finditer() 。
findall() 返回的是一个列表:
findall() 需要在返回前先创建一个列表,而 finditer() 则是将匹配对象作为一个迭代器返回:
批注:如果列表很大,那么返回迭代器的效率要高很多。
(本文完)
如果你喜欢这篇文章,请通过下方「评论」给我鼓励哦 ^_^
详解 Python3 正则表达式(二)的更多相关文章
- 详解 Python3 正则表达式(三)
上一篇:详解 Python3 正则表达式(二) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 模块级别的函数 ...
- 详解 Python3 正则表达式(一)
本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 正则表达式介绍 正则表达式(Regular expressio ...
- 详解 Python3 正则表达式(五)
上一篇:详解 Python3 正则表达式(四) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些注明和修改 ^_^ 非捕获组和命名 ...
- 详解 Python3 正则表达式(四)
上一篇:详解 Python3 正则表达式(三) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些注明和修改 ^_^ 更多强大的功能 ...
- Java 正则表达式详解_正则表达式
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- JavaScript学习笔记-实例详解-类(二)
实例详解-类(二) //===给Object.prototype添加只读\不可枚举\不可配置的属性objectId(function(){ Object.defineProperty(Object ...
- (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...
- 详解JMeter正则表达式
详解JMeter正则表达式(1) 1.概览 JMeter中包含范本匹配软件Apache Jakarta ORO .在Jakarta网站上有一些关于它的文档,例如a summary of the pat ...
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...
随机推荐
- STL算法分类记忆
STL算法主要是我们强大的标准库中以迭代器或数值或函数对象为参数预先定义好的一系列算法操作. 在STL算法分类中首先要提的就是两个普遍存在的后缀: _if _copy 其中这两个后缀的作用分别是:一. ...
- js 获取URL中参数
function getQueryString() { var result = location.search.match(new RegExp("[\?\&][^\?\& ...
- Eclipse 无法编译,提示“错误: 找不到或无法加载主类”
jar包问题: 1.项目的Java Build Path中的Libraries中有个jar包的Source attachment指为了一个不可用的jar包, 解决办法是:将这个不可用的jar包remo ...
- QT容器map的插入,修改,遍历
除了map,QT的容器还有hash,以及迭代器等,这里写的是map #include "mainwindow.h" #include <QApplication> #i ...
- Toad for MySQL 7.3 Freeware异常 2017-01-09 15:14 115人阅读 评论(0) 收藏
打开Toad出现如下异常信息: 解决办法: 重装.NET Framework4.0
- Event Driven Architecture
在微服务中使用领域事件 稍微回想一下计算机硬件的工作原理我们便不难发现,整个计算机的工作过程其实就是一个对事件的处理过程.当你点击鼠标.敲击键盘或者插上U盘时,计算机便以中断的形式处理各种外部事件 ...
- nfs 服务器
1.创建共享目录 #mkdir /home/hellolinux/nfs 2.创建或修改/etc/exports文件 #vi /etc/exports home/hellolinux/nfs 192. ...
- 使用combineReducers注意事项
一.从‘redux’包中引入combineReducers方法: import { combineReducers } from 'redux'; 二.针对state的不同属性写不同的reducer, ...
- 我上线的android版app
把自己开发的几个小的app上线了,在自己的博客中推广一下吧: 聊天兔子: 下载地址:http://android.myapp.com/myapp/detail.htm?apkName=com.fuly ...
- 一.在Linux中for和cat遍历文件内容出现no space
以前使用for var in file方式逐行读取文件内容的时候,都没有出现问题,但是今天使用如下代码,会出现“no space” ,目标数据文件内容为6.8M, # 写入临时文件,第一行不能写入 f ...