设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 46519|回复: 20
打印 上一主题 下一主题

【Python 第58课】 正则表达式(4)

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-9-23 20:10:57 |显示全部楼层 |倒序浏览
1.
我们已经了解了正则表达式中的一些特殊符号,如\b、\d、.、\S等等。这些具有特殊意义的专用字符被称作“元字符”。常用的元字符还有:

\w - 匹配字母或数字或下划线或汉字(我试验下了,发现3.x版本可以匹配汉字,但2.x版本不可以)
\s - 匹配任意的空白符
^ - 匹配字符串的开始
$ - 匹配字符串的结束

2.
\S其实就是\s的反义,任意不是空白符的字符。同理,还有:

\W - 匹配任意不是字母,数字,下划线,汉字的字符
\D - 匹配任意非数字的字符
\B - 匹配不是单词开头或结束的位置

[a]的反义是[^a],表示除a以外的任意字符。[^abcd]就是除abcd以外的任意字符。

3.
之前我们用过*、+、{}来表示字符的重复。其他重复的方式还有:

? - 重复零次或一次
{n,} - 重复n次或更多次
{n,m} - 重复n到m次

正则表达式不只是用来从一大段文字中抓取信息,很多时候也被用来判断输入的文本是否符合规范,或进行分类。来点例子看看:
^\w{4,12}$
这个表示一段4到12位的字符,包括字母或数字或下划线或汉字,可以用来作为用户注册时检测用户名的规则。(但汉字在python2.x里面可能会有问题)

\d{15,18}
表示15到18位的数字,可以用来检测身份证号码

^1\d*x?
以1开头的一串数字,数字结尾有字母x,也可以没有。有的话就带上x。

另外再说一下之前提到的转义字符\。如果我们确实要匹配.或者*字符本身,而不是要它们所代表的元字符,那就需要用\.或\*。\本身也需要用\\。
比如"\d+\.\d+"可以匹配出123.456这样的结果。

留一道稍稍有难度的习题:
写一个正则表达式,能匹配出多种格式的电话号码,包括
(021)88776543
010-55667890
02584453362
0571 66345673

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

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


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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-9-25 12:41:12 |显示全部楼层
liqing215 发表于 2013-9-24 19:44
提问crossin先生:
      您的微信公众帐号后面是用编辑模式还是开发模式啊?
      用开发模式的话它自带 ...

编辑模式

开发模式就不能用微信自带的功能了。
用python也可以,本质上就是收到一个xml文件,再返回一个xml文件
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2013-9-26 13:39:57 |显示全部楼层
liqing215 发表于 2013-9-25 23:08
xml文件的排版是不是很麻烦啊?

因为1.我想每天发多条图文信息,直接用编辑模式很好用,但如果直接在代 ...

不可。用了开发模式,你就得忍受排版的痛苦。你可以自己再写一个后台,用来帮自己排版,这样写一次就可以重复用了。好像也有人开发过这种基于“开发模式”的后台,你搜搜看
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2013-9-30 10:53:26 |显示全部楼层
Myk_cc 发表于 2013-9-29 22:51
通过这次学习 我改进了一下匹配手机号的正则表达式(在图中)再次匹配了下同学留下的数据果然又新出现好几 ...

有个小问题,正则里如果需要表示字符而不是特殊符号,应该用\转义,而不是加引号。这里加了引号就只是表示'这个字符。
而且在[]里的'('是不用转义的,直接写(就可以了。写成\(也可以
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2013-11-3 21:11:05 |显示全部楼层
blake 发表于 2013-11-2 17:11
为什么8楼的第三种不能通过呢?
[ )-]和[) -]能通过

我也觉得没问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2014-7-16 19:32:56 |显示全部楼层
toddlerya 发表于 2014-7-16 12:22
r"[(]?\d{1,4}[)]?[-]?\s?\d{8}"
为什么这样就不对了
r"^[(]?\d{1,4}[)]?[-]?\s?\d{8}$"

这样就限定了必须是文本的开头和结尾。除非只有一个号码才能匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2016-2-22 22:54:37 |显示全部楼层
catherinemic 发表于 2016-2-22 20:09
^1\d*[x]?
以1开头的一串数字,数字结尾有字母x,也可以没有。有的话就带上x。

中括号是可选,不括起来就一定得有x
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2016-2-22 22:58:16 |显示全部楼层
catherinemic 发表于 2016-2-22 20:09
^1\d*[x]?
以1开头的一串数字,数字结尾有字母x,也可以没有。有的话就带上x。

中括号表示可选,如果不加,那就必须要有x
===================
更正:这里中括号加不加效果是一样的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2016-2-24 11:26:03 |显示全部楼层
catherinemic 发表于 2016-2-24 10:56
如果不加中括号,x后还有?表示连续0-1次,0次的话不就表示可以没有x吗?

sorry,我这里搞错了,的确不用加[]也是一样的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2016-6-4 22:37:56 |显示全部楼层
kuaikemai 发表于 2016-6-4 15:41
老师,在本次课中你说正则表达式也可以用来检测输入的信息是否符合规则。
像输入用户名、身份证号码等。具 ...

你这样是可行的的。不过正则本身就可以用^和$限定开头和结尾,限定了之后,能匹配出来就是正确,匹配不出来就是错误
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-5-3 17:55 , Processed in 0.029712 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部