本文讲述了python实现的正则表达式功能。分享给大家供大家参考,具体如下:
前文:
首先,什么叫正则表达式(Regular Expression)?
例如我们要判断字符串"adi_e32fv,Ls"里面是否含有子串"e32f",又例如我们在一个含百万个姓名的txt文件中找姓“王”,名字以“五”结尾的名字,然后打印出来。结果为:“王五”、“王小五”、“王大五”、“王小小五”……
以前我们是使用字符串函数来查找的,但是代码实现起来会很复杂。如今用正则表达式只需要一句 re.findall('王.*?五',txt1) 就可以了!正则表达式是写网络爬虫的最基本的知识,可以用正则表达式在html中搜集满足某些字串要求的网址。下面是个人对正则表达式基础知识的一些总结。
(操作环境:32位Win8系统,运行工具:python2.7.9+Eclipse.)
正文:
1、首先要导入python的re模块。
2、元字符 . ^ $ * + "htmlcode">
str1 = 'dit dot det,dct dit dot' print re.findall('dit',str1)
结果:
['dit', 'dit']
|作用:'dit|dct'表示dit或者dct。
str1 = 'dit dot det,dct dit dot' print re.findall('dit|dct',str1)
结果:
['dit', 'dct', 'dit']
[]作用:[ic]表示i或c,例如'd[ic]t'表示dit和dct两者,和'dit|dct'等价:
str1 = 'dit dot det,dct dit dot' print re.findall('d[ic]t',str1)
结果:
['dit', 'dct', 'dit']
^作用一:[^ic]中^表示否定,即除了i和c:
str1 = 'dit dot det,dct dit dot' print re.findall('d[^ic]t',str1)
结果:
['dot', 'det', 'dot']
^作用二:^dit表示子串dit在开头位置,而dct不是在开头:
str1 = 'dit dot det,dct dit dot' print re.findall('^dit',str1) print re.findall('^dct',str1)
结果:
['dit'][]
$作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:
str1 = 'dit dot det,dct dit dot' print re.findall('dot$',str1) print re.findall('dct$',str1)
结果:
['dot'][]
.作用:d.t表示d与t之间省略了一个任意字符:
str1 = 'dit dot det,dct dit dot' print re.findall('d.t',str1)
结果:
['dit', 'dot', 'det', 'dct', 'dit', 'dot']
+作用:di+t表示d与t之间省略了一个或多个'i':
str1 = 'd dt dit diit det' print re.findall('d.+t',str1)
结果:
['dit', 'diit']
*作用:di*t表示d与t之间省略了零个至多个'i':
str1 = 'd dt dit diit det' print re.findall('d.*t',str1)
结果:
['dt', 'dit', 'diit']
经常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:
str1 = 'd dt dit diit det' print re.findall('d.+t',str1) print re.findall('d.*t',str1)
结果:
['d dt dit diit det']['d dt dit diit det']
?作用一:看.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,而输出的却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如果要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样,只需在'*'后面加上'?')
str1 = 'd dt dit diit det' print re.findall('d.+"htmlcode">['dit', 'dot', 'det', 'dct', 'dit', 'dot']?作用二:di"htmlcode">
str1 = 'd dt dit diit det' print re.findall('di"htmlcode">['dt', 'dit']{}作用一:di{n}t表示d和t之间有n个'i':
str1 = 'dt dit diit diiit diiiit' print re.findall('di{2}t',str1)结果:
['diit']{}作用二:di{n,m}t表示d和t之间有n到m个'i':
str1 = 'dt dit diit diiit diiiit' print re.findall('di{1,3}t',str1)结果:
['dit', 'diit', 'diiit']其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,和'*'功能一样:
str1 = 'dt dit diit diiit diiiit' print re.findall('di{1,}t',str1) print re.findall('di{,3}t',str1) print re.findall('di{,}t',str1)结果:
['dit', 'diit', 'diiit', 'diiiit'] ['dt', 'dit', 'diit', 'diiit'] ['dt', 'dit', 'diit', 'diiit', 'diiiit']\作用一:取消元字符,变成转义字符:
str1 = '^abc ^abc' print re.findall('^abc',str1) print re.findall('\^abc',str1)结果:
[]['^abc', '^abc']\作用二:预定义字符
str1 = '12 abc 345 efgh' print re.findall('\d+',str1) print re.findall('\w+',str1)结果:
['12', '345'] ['12', 'abc', '345', 'efgh']()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:
str1 = '12abcd34' print re.findall('12abcd34',str1) print re.findall('1(2a)bcd34',str1) print re.findall('1(2a)bc(d3)4',str1)结果:
['12abcd34'] ['2a'] [('2a', 'd3')]3、re模块里的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。
re.findall(pattern,string,flags = 0)
作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。
str1 = 'ab cd' print re.findall('\w+',str1)结果:['ab', 'cd']
re.finditer(pattern,string,flags = 0)
作用:其功能与re.findall相同,但结果以迭代器的形式返回。
str1 = 'ab cd' iter1 = re.finditer('\w+',str1) for a in iter1: print a.group(),a.span()结果:
ab (0, 2)
cd (3, 5)(注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)
re.search(pattern,string,flags = 0)
作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。
str1 = 'ab cd' result = re.search('cd',str1) if result == None: print 'None' else: print result.group(),result.start(),result.end()结果:cd 3 5
re.match(pattern,string,flags = 0)
作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。
str1 = 'ab cd' result = re.match('cd',str1) if result == None: print 'None' else: print result.group(),result.start(),result.end()结果:None
re.compile(pattern,flags = 0)
作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。
str1 = 'ab cd' pre = re.compile('ab') print pre.findall(str1)结果:['ab']
re.split(pattern,string,maxsplit = 0,flags = 0)
作用:在string匹配pattern的时候做分割:
str1 = 'ab.c.de' str2 = '12+34-56*78/90' print re.split('\.',str1) print re.split('[\+\-\*/]',str2)结果:
['ab', 'c', 'de']
['12', '34', '56', '78', '90']re.sub(pattern,repl,string,count = 0,flags = 0)
作用:在string当中把满足pattern正则的字串替换成repl:
str1 = 'abcde' print re.sub('bc','123',str1)结果:a123de
re.subn(pattern,repl,string,count = 0,flags = 0)
作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次
str1 = 'abcdebce' print re.subn('bc','123',str1)结果:('a123de123e', 2)
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 群星《这座城市的歌》2CD[DTS-WAV]
- 大自然音乐系列《缤纷四季》[WAV/CUE/分轨][567.9MB]
- 《宝岛情歌·甜歌声声醉》黑胶2CD[WAV+CUE][900MB]
- 《十四首发烧友公认的好歌 微风细雨》[WAV+CUE][410MB]
- 群星.2024-小财迷影视剧原声带【星辰盛想】【FLAC分轨】
- 群星.1994-宝丽金主题曲巡礼【宝丽金】【WAV+CUE】
- 胡杨林.2011-爱上了瘾(EP)【喜欢音乐】【WAV+CUE】
- 仙境传说新启航2024公测可用礼包码大全 仙境传说兑换码礼包大全
- 魔兽世界地心之战神牧用什么食物合剂 地心之战神牧食物合剂推荐
- 魔兽世界地心之战神牧用什么附魔宝石 地心之战神牧附魔宝石推荐
- 明达年度发烧碟MasterSuperiorAudiophile2019[DSF]
- 明达年度发烧碟MasterSuperiorAudiophile2020[DSF]
- 【发烧唱片】Naim《示范碟(第二辑)》1999[WAV+CUE]
- 《优米雅的炼金工房》“妮娜”战斗实机:大雷黑丝金发御姐
- 许冠杰.2003-四合一珍藏集4CD【宝丽金】【WAV+CUE】