请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 28884|回复: 25

【Python 第55课】 正则表达式(1)

[复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-9-16 19:39:33 |显示全部楼层
今天来挖个新坑,讲讲正则表达式。

什么是正则表达式?在回答这个问题之前,先来看看为什么要有正则表达式。

在编程处理文本的过程中,经常会需要按照某种规则去查找一些特定的字符串。比如知道一个网页上的图片都是叫做'image/8554278135.jpg'之类的名字,只是那串数字不一样;又或者在一堆人员电子档案中,你要把他们的电话号码全部找出来,整理成通讯录。诸如此类工作,如果手工去做,当量大的时候那简直就是悲剧。但你知道这些字符信息有一定的规律,可不可以利用这些规律,让程序自动来做这些无聊的事情?答案是肯定的。这时候,你就需要一种描述这些规律的方法,正则表达式就是干这事的。

正则表达式就是记录文本规则的代码。

所以正则表达式并不是python中特有的功能,它是一种通用的方法。python中的正则表达式库,所做的事情是利用正则表达式来搜索文本。要使用它,你必须会自己用正则表达式来描述文本规则。之前多次有同学表示查找文本的事情经常会遇上,希望能介绍一下正则表达式。既然如此,我们就从正则表达式的基本规则开始说起。

1.
首先说一种最简单的正则表达式,它没有特殊的符号,只有基本的字母或数字。它满足的匹配规则就是完全匹配。例如:有个正则表达式是“hi”,那么它就可以匹配出文本中所有含有hi的字符。

来看如下的一段文字:
Hi, I am Shirley Hilton. I am his wife.

如果我们用“hi”这个正则表达式去匹配这段文字,将会得到两个结果。因为是完全匹配,所以每个结果都是“hi”。这两个“hi”分别来自“Shirley”和“his”。默认情况下正则表达式是严格区分大小写的,所以“Hi”和“Hilton”中的“Hi”被忽略了。

为了验证正则表达式匹配的结果,你可以用以下这段代码做实验:
  1. import re
  2. text = "Hi, I am Shirley Hilton. I am his wife."
  3. m = re.findall(r"hi", text)
  4. if m:
  5.     print m
  6. else:
  7.     print 'not match'
复制代码
暂时先不解释这其中代码的具体含义,你只要去更改text和findall中的字符串,就可以用它来检测正则表达式的实际效果。

2.
如果我们只想找到“hi”这个单词,而不把包含它的单词也算在内,那就可以使用“\bhi\b”这个正则表达式。在以前的字符串处理中,我们已经见过类似“\n”这种特殊字符。在正则表达式中,这种字符更多,以后足以让你眼花缭乱。

“\b”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。而“\b”自身又不会匹配任何字符,它代表的只是一个位置。所以单词前后的空格标点之类不会出现在结果里。

在前面那个例子里,“\bhi\b”匹配不到任何结果。但“\bhi”的话就可以匹配到1个“hi”,出自“his”。用这种方法,你可以找出一段话中所有单词“Hi”,想一下要怎么写。

3.
最后再说一下[]这个符号。在正则表达式中,[]表示满足括号中任一字符。比如“[hi]”,它就不是匹配“hi”了,而是匹配“h”或者“i”。

在前面例子中,如果把正则表达式改为“[Hh]i”,就可以既匹配“Hi”,又匹配“hi”了。


#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:156630350

面向零基础初学者的编程课
每天5分钟,轻松学编程


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

95

积分

注册会员

Rank: 2

发表于 2013-9-16 20:50:44 |显示全部楼层
学习了,最近论坛不是很稳定,抓紧学习
回复

使用道具 举报

2

主题

0

好友

71

积分

注册会员

Rank: 2

发表于 2013-9-16 23:23:19 |显示全部楼层

回帖奖励 +3

猜测re.findall(r"hi", text)中的r是read的意思。。那难道还有w...
回复

使用道具 举报

2

主题

0

好友

71

积分

注册会员

Rank: 2

发表于 2013-9-16 23:23:46 |显示全部楼层
re.findall(r"hi", text)猜测其中的r是read意思,这么说难道也有w。。。
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-9-16 23:47:17 |显示全部楼层
dark 发表于 2013-9-16 23:23
re.findall(r"hi", text)猜测其中的r是read意思,这么说难道也有w。。。

错了,是raw的意思
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

132

积分

注册会员

Rank: 2

发表于 2013-9-17 15:28:48 |显示全部楼层

回帖奖励 +3

正则这个东西如果没有一个环境让你持续的思考记忆个半年,是很难掌握好的。
我建议正则课程结束后,是不是应该开一个置顶的正则的练习贴的帖子,老师和同学都可以把自己的联系题发上去,不用多,一周有个1-2题就可以了。
只有持续的练习才能掌握的更好。
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-9-17 16:36:17 |显示全部楼层
aresli 发表于 2013-9-17 15:28
正则这个东西如果没有一个环境让你持续的思考记忆个半年,是很难掌握好的。
我建议正则课程结束后,是不是 ...

ok
课程里只能大概解释一下原理和规则,要想掌握,还得用很久才能熟悉。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

152

积分

注册会员

Rank: 2

发表于 2013-10-2 00:12:55 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

发表于 2014-9-27 00:53:48 |显示全部楼层
我感觉一定要用的多才行。
学习,纯粹。
回复

使用道具 举报

0

主题

0

好友

96

积分

注册会员

Rank: 2

发表于 2017-1-13 14:36:25 |显示全部楼层
在前面那个例子里,“\bhi\b”匹配不到任何结果。但“\bhi”的话就可以匹配到1个“hi”,出自“his”。用这种方法,你可以找出一段话中所有单词“Hi”,想一下要怎么写。


这个怎么没有同学回答啊?到底应该怎么写?
  1. import re
  2. text = "Hi, I am S hirley Hilton. I am his wife."
  3. m = re.findall(r'\bhi', text)
  4. if m:
  5.     print m
  6. else:
  7.     print 'not match'
复制代码
实在想不出来,在这S hirley加了个空格
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-19 03:12 , Processed in 0.034784 second(s), 36 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部