1
介绍
正则表达式是一个特殊的字符序列,用来判断一个字符串与我们所设定的字符序列是否相匹配。实现快速检索文本和一些替换文本的操作。
在Python中我们有专门的正则表达式模块re,re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
2
常见函数
这里介绍几个正则表达式的常见函数。
1. re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern, string, flags=0)
参数介绍如下:
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
实例
import reprint(re.match('www', 'www.bilibili.com').span()) # 在起始位置匹配print(re.match('com', 'www.bilibili.com')) # 不在起始位置匹配
上例输出结果为
(0, 3)None
2. re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
函数参数同re.match方法
实例
import reprint(re.search('www','www.bilibili.com').span()) # 在起始位置匹配print(re.search('com', 'www.bilibili.com').span()) # 不在起始位置匹配
上述实例输出结果为
(0, 3)(11, 14)
Ps:re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
3. 检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数说明:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
实例
import rephone = "2004-959-559 # 这是一个国外电话号码"# 删除字符串中的 Python注释num = re.sub(r'#.*$', "", phone) print ("电话号码是: ", num)# 删除非数字(-)的字符串num = re.sub(r'\D', "", phone)print( "电话号码是 : ", num)
以上实例输出结果为
电话号码是: 2004-959-559电话号码是 : 2004959559
4. re.compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
参数说明:
pattern : 一个字符串形式的正则表达式
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
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 为了增加可读性,忽略空格和 # 后面的注释
findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意:match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall(string[, pos[, endpos]])
参数:
string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
语法格式:
re.finditer(pattern, string, flags=0)
3
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
1. 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
2. 多数字母和数字前加一个反斜杠时会拥有不同的含义。
3. 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
4. 反斜杠本身需要使用反斜杠转义。
5. 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 '\\t')匹配相应的特殊字符。
实例:
4
一个简单的小练习
下面就到了尾声,这里留一个小小的练习供大家复习正则表达式~
请用正则表达式将下面字符串里面的英文行分离出来,保存在列表,列表里面的每一个元素为一行英文(包括标点符号)。
And now, the end is near;
现在,我的末日将近,
And so I face the final curtain.
面临人生的最后落幕,
My friend, I'll make it clear,
我的朋友,我要说个清楚,
I'll state my case, of which I'm certain.
向你讲述我的人生之路。
I've lived a life that's full.
我活过一个充实的人生,
I've traveled each and every highway;
我经历过每一段路途,
And more, much more I did,
而更重要的是,
I did it my way.
我用自己的方式。
Regrets, I've had a few;
遗憾,也有一些吧,
But then again, too few to mention.
算不上多,不值一提。
I did what I had to do
我做了该做的一切,
And saw it through without exemption.
洞悉世事,不求赦免。
I planned each charted course;
我规划过每一段人生,
Each careful step along the by way,
每一个细微的脚步,
and more, much more than this,
而更重要的是,
I did it my way.
我用自己的方式。
Yes, there were times, I'm sure you knew
是的,你知道有些时候,
When I bit off more than I could chew.
我曾背负不能承受之重,
But through it all, when there was doubt,
但自始至终,就算充满疑惑,
I ate it up and spit it out.
我还是克服困难战胜了它。
I faced it all and I stood tall;
我挺直身躯,勇敢面对,
And did it my way.
用我自己的方式。
I’ve loved, I’ve laughed and cried.
我曾经爱过,笑过,哭过,
I’ve had my fill; my share of losing.
我曾经满足,也曾经失落,
And now, as tears subside,
现在,当泪水慢慢沉淀,
I find it all so amusing.
我发现原来可以一笑置之。
To think I did all that;
想到我所做过的一切,
And may I say - not in a shy way,
我可以说,毫不羞愧地说,
No, oh no not me,
我没有虚度,
I did it my way.
我用自己的方式。
For what is a man, what has he got?
男人究竟是什么,拥有什么?
If not himself, then he has naught.
除了自己,我们一无所有。
To say the things he truly feels;
说出心里最真实的感受,
And not the words of one who kneels.
而不是那些身不由己的话。
The record shows I took the blows -
时间证明,我经受住了磨难,
And did it my way!
用我自己的方式!
Yes, it was my way.
没错,这就是我的方式。
答案:
s = '''
诗歌内容
'''
res = re.findall(r'\n\s+([ a-zA-Z,.。!;?]+)\n',s)
for line in res:
print(line)
本期作者:刘奚彤
本期编辑校对:秦范
长按,关注数据皮皮侠