设为首页收藏本站

Crossin的编程教室

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

【Python 第56课】 正则表达式(2)

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-9-18 00:21:05 |显示全部楼层 |倒序浏览
有同学问起昨天那段测试代码里的问题,我来简单说一下。

1.
r"hi"

这里字符串前面加了r,是raw的意思,它表示对字符串不进行转义。为什么要加这个?你可以试试print "\bhi"和r"\bhi"的区别。
>>> print "\bhi"
hi
>>> print r"\bhi"
\bhi

可以看到,不加r的话,\b就没有了。因为python的字符串碰到“\”就会转义它后面的字符。如果你想在字符串里打“\”,则必须要打“\\”。
>>> print "\\bhi"
\bhi

这样的话,我们的正则表达式里就会多出很多“\”,让本来就已经复杂的字符串混乱得像五仁月饼一般。但加上了“r”,就表示不要去转义字符串中的任何字符,保持它的原样。

2.
re.findall(r"hi", text)

re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。

3.
今天主要说两个符号“.”和“*”,顺带说下“\S”和“?”。
“.”在正则表达式中表示除换行符以外的任意字符。在上节课提供的那段例子文本中:
Hi, I am Shirley Hilton. I am his wife.

如果我们用“i.”去匹配,就会得到
['i,', 'ir', 'il', 'is', 'if']

你若是暴力一点,也可以直接用“.”去匹配,看看会得到什么。

与“.”类似的一个符号是“\S”,它表示的是不是空白符的任意字符。注意是大写字符S。

4.
在很多搜索中,会用“?”表示任意一个字符,“*”表示任意数量连续字符,这种被称为通配符。但在正则表达式中,任意字符是用“.”表示,而“*”则不是表示字符,而是表示数量:它表示前面的字符可以重复任意多次(包括0次),只要满足这样的条件,都会被表达式匹配上。

结合前面的“.*”,用“I.*e”去匹配,想一下会得到什么结果?
['I am Shirley Hilton. I am his wife']

是不是跟你想的有些不一样?也许你会以为是
['I am Shirle', 'I am his wife']

这是因为“*”在匹配时,会匹配尽可能长的结果。如果你想让他匹配到最短的就停止,需要用“.*?”。如“I.*?e”,就会得到第二种结果。这种匹配方式被称为懒惰匹配,而原本尽可能长的方式被称为贪婪匹配。

最后留一道习题:
从下面一段文本中,匹配出所有s开头,e结尾的单词。

site sea sue sweet see case sse ssee loses


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

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

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-9-19 00:49:16 |显示全部楼层
jpjlqone 发表于 2013-9-18 13:21
先生,我想在win下模拟鼠标中键的滚动行为,没能找到适用的模块。希望能提供点信息。 ...

pygame的pygame.MOUSEBUTTONDOWN可以监听鼠标滚轮事件
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2013-9-19 00:50:49 |显示全部楼层
jpjlqone 发表于 2013-9-18 13:21
先生,我想在win下模拟鼠标中键的滚动行为,没能找到适用的模块。希望能提供点信息。 ...

哦,你说的是模拟,参考一下这个看看
http://blog.csdn.net/sunyonggao/article/details/8121061
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2013-9-20 23:47:52 |显示全部楼层
aison 发表于 2013-9-19 12:34
import re
text = 'site sea sue sweet see case sse ssee loses'
pattern = re.compile(r'\bs\S*?e\b')

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2013-9-20 23:56:36 |显示全部楼层
jpjlqone 发表于 2013-9-19 10:09
老师中秋节好!
这个文章我看过,它能够模拟鼠标中键点下去,然后移动鼠标,最后中键抬起(方法一)。
但 ...

win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL,0,0,-20,win32con.WHEEL_DELTA)

http://blog.sina.com.cn/s/blog_53f023270101ors4.html
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2013-9-22 00:35:07 |显示全部楼层
Myk_cc 发表于 2013-9-21 20:06

不错的,赞一下现学现用的学习方式!
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2014-5-18 15:10:53 |显示全部楼层
文心雕龙 发表于 2014-5-17 14:52
\bs\S.*?e\b和\bs.*?e\b输出结果一样的,请问是不是可以理解为这几个符号有优先级? ...

这两个不完全一样。
前面加了个\S,其实相当于是先匹配一个非空白字符,然后再匹配任意数量字符。
如果有"se",那么前者无法匹配,后者可以。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2014-12-19 11:52:24 |显示全部楼层
r"/b"
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2015-4-5 13:51:07 |显示全部楼层
sukiak 发表于 2015-4-5 10:10
老师,
import re
text = "Shirley  his"

hi只能匹配到hi,如果你想匹配整个单词,得在前后加上匹配0~n个非空格字符的正则,如
\w*hi\w*
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2016-2-2 23:00:49 |显示全部楼层
catherinemic 发表于 2016-2-2 14:46
Crossin老师,想问一下,既然r'\bhi'表示非转译的原始字符‘\bhi',但是为什么re.findall(r'\bhi', text)的 ...

直接写'\bhi',\b就被转义了。
找\bhi的话,要防止\b作为特殊元字符去匹配,所以需要用
r"\\bhi"
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-5-4 10:12 , Processed in 0.027043 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部