设为首页 收藏本站
查看: 1087|回复: 0

[经验分享] python正则模块 re

[复制链接]
累计签到:81 天
连续签到:1 天
发表于 2018-4-22 07:41:19 | 显示全部楼层 |阅读模式
正则:描述匹配的规则
正则就是用一些具有特殊含义的符号组合到一起(正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则

import re
#####方法################
re.findall('匹配规则','匹配对象'):匹配返回所有满足匹配条件的结果,放在列表里;
re下的最常用方法
print(re.findall('c','chencs sfd d c dsfc'))
#===>['c','c', 'c', 'c']

#####规则#####正则表达式################
######匹配字符###
#\w匹配字母数字下划线
print(re.findall("\w","qwa123_\n\t\r&^%@!#$%^&"))
#===>'q','w','a','1','2','3','_']
#\W匹配非字母数字下划线
print(re.findall("\W","qwa123_\n\t\r&^%@!#$%^&"))
#====>['','','','\n','','\t','','\r','','&','^','%','@','!','#','$','%','^','&','']
#\s匹配任意空白字符(\n\t\r\f)
print(re.findall("\s","qwa123_\n\t\r&^%@!#$%^&"))
#====>['','','','\n','','\t','','\r','','']
#\S匹配任意非空白字符
print(re.findall("\S","qwa123_\n\t\r&^%@!#$%^&"))
#===>['q','w','a','1','2','3','_','&','^','%','@','!','#','$','%','^','&']
#\d匹配任意数字
print(re.findall("\d","qwa123_\n\t\r&^%@!#$%^&"))
#===>['1','2','3']
#\D匹配任意非数字
print(re.findall("\D","qwa123_\n\t\r&^%@!#$%^&"))
#['q','w','a','','','_','','\n','','\t','','\r','','&','^','%','@','!','#','$','%','^','&','']
#\A匹配以指定字符串开头=====^
print(re.findall('\Achen','mynameischen'))
print(re.findall('\Achen','chenismyname'))
print(re.findall('^chen','chenismyname'))
#===>[]
#===>['chen']
#===>['chen']

#\Z匹配以指定字符结尾 ====$
print(re.findall('chen\Z','chenismyname'))
print(re.findall('chen\Z','mynameischen'))
print(re.findall('chen$','mynameischen'))
#==>[]
#==>['chen']
#==>['chen']

#^chen$以chen开头,以chen结尾,即匹配以chen
print(re.findall('^chen$','chen'))
#===>['chen']

#####重复匹配#####指定字符的匹配次数#################
# .  ?  *   .*   .*?   +   {m,n}   |  ()

.默认表示除了换行符之外的任意一个字符,在findall中使用re.DOTALL可以让.匹配包括\n的任意字符

print(re.findall('a.c','abca1caAcaaaaaca\nc'))
#====>['abc','a1c','aAc','aac']
print(re.findall('a.c','abca1caAcaaaaaca\nc',re.DOTALL))
#====>['abc','a1c','aAc','aac','a\nc']

?:代表?左边的第一个字符重复0次或1次
print(re.findall('ab?','aababbabbbabbbbabbbb'))
#===>['a','ab','ab','ab','ab','ab']

*:代表*左边的第一个字符重复0次或无穷次
print(re.findall('ab*','aababbabbbabbbbabbbba1bbbbbbb'))
#===>['a','ab','abb','abbb','abbbb','abbbb','a']

+:代表+左边的第一个字符重复1次或无穷次
print(re.findall('ab+','aababbabbbabbbbabbbba1bbbbbbb'))
#==>['ab','abb','abbb','abbbb','abbbb']


{m,n}:代表左边的第一个字符重复m次到n次
#{m}:取m次
#{0,}:0次到无穷次
#{0.1}:0次到1次
#{1,}:1次到无穷次
#{1,3}:1次到3次
print(re.findall('ab{1,3}','aababbaababbb'))
#===>['ab','abb','ab','abbb']

.*:匹配任意长度,任意的字符,贪婪匹配,尽可能长的匹配(引号内的是一个字符串,空格也是字符串)
print(re.findall('a.*c','acasfca123c1c44c25c6casdfgdghgfdf'))
#====>['acasfca123c1c44c25c6c']

.*?非贪婪匹配
print(re.findall('a.*?c','acasfca123c1c44c25c6casdfgdghgfdf'))
#==>['ac','asfc','a123c']尽可能短的匹配

():分组my_(Joy)_chen以my_Joy_chen进行匹配,匹配成功后只保留括号内的内容
(?:)?:取消分组效果

print(re.findall('(alex)_sb','alex_sbasdfsafdafdaalex_sb'))
#===>['alex','alex']

#<li><aid="blog_nav_sitehome"class="menu"href="http://www.cnblogs.com/">博客园</a></li>
print(re.findall(
'href="(.*?)"',
'<li><aid="blog_nav_sitehome"class="menu"href="http://www.cnblogs.com/">博客园</a></li>')
)
#===>['http://www.cnblogs.com/']匹配href="xxxxxxx",只显示xxxxx;虽然.*?是尽可能短的匹配,但必须匹配""

print(re.findall(
'href="(.*)"',
'<li><aid="blog_nav_sitehome"class="menu"href="http://www.cnblogs.com/">博客园</a></li>')
)
#===>['http://www.cnblogs.com/']匹配href="xxxxxxx",只显示xxxxx;虽然.*是尽可能长的匹配,但必须匹配""
print(re.findall(
'href="(.*?)',
'<li><aid="blog_nav_sitehome"class="menu"href="http://www.cnblogs.com/">博客园</a></li>')
)
#====>['']匹配href="xxxxxxx只显示xxxxx,尽可能短的匹配,所以匹配空
print(re.findall(
'href="(.*)',
'<li><aid="blog_nav_sitehome"class="menu"href="http://www.cnblogs.com/">博客园</a></li>')
)
#===>['http://www.cnblogs.com/">博客园</a></li>']匹配href="xxxxxxx只显示xxxxx,尽可能长的匹配

print(re.findall(
'href="(?:.*?)"',
'<li><aid="blog_nav_sitehome"class="menu"href="http://www.cnblogs.com/">博客园</a></li>')
)
#==>['href="http://www.cnblogs.com/"']

[]:匹配一个指定范围内的字符(这一个字符来自于括号内定义的)
[a-z]
[0-9]
[A-Z]

print(re.findall('a[0-9][0-9]c','a1ca+ca2ca9ca11ca-caccaAca98c'))
#==>['a11c','a98c']a两个数字c

print(re.findall('([a-z]+)_user','enon_useralex_u3rwsdfs_userjiec_user'))
#==>['enon','rwsdfs','jiec']匹配到了enon_userrwsdfs_userjiec_user只显示enonrwsdfsjiec

当-需要被当中普通符号匹配时,只能放到[]的最左边或最右边
print(re.findall('a[-+*]c','a1ca+ca2ca9ca*ca11ca-caccaAc'))
#===>['a+c','a*c','a-c']

print(re.findall('a[a-zA-Z]c','a1ca+ca2ca9ca*ca11ca-caccaAc'))
#===>['acc','aAc']

#[]内的^代表取反的意思
print(re.findall('a[^a-zA-Z]c','aca1ca+ca2ca9ca*ca11ca-caccaAc'))
#==>['ac','a1c','a+c','a2c','a9c','a*c','a-c']

print(re.findall('a[^0-9]c','aca1ca+ca2ca9ca*ca11ca-caccaAc'))
#==>['ac','a+c','a*c','a-c','acc','aAc']

print(re.findall('([a-z]+)_sb','egonalex_sb123123wxxxxxxxxxxxxx_sb,lxx_sb'))
#===>['alex','wxxxxxxxxxxxxx','lxx']


#|:或者
print(re.findall('compan(ies|y)','Toomanycompanieshavegonebankrupt,andthenextoneismycompany'))
#===>['ies','y']

#(?:):代表取匹配成功的所有内容,而不仅仅只是括号内的内容
print(re.findall('compan(?:ies|y)','Toomanycompanieshavegonebankrupt,andthenextoneismycompany'))
#==>['companies','company']
#print(re.findall('alex|sb','alexsbsadfsadfasdfegonalexsbegon'))




#re模块的其他方法:

#re.findall("正则表达式","字符串")返回所有满足匹配条件的结果,放在列表里
#re.findall("正则表达式","字符串",re.DOTALL)
print(re.findall('alex|sb','123123alexsbsadfsadfasdfegonalexsbegon'))
#==>['alex','sb','alex','sb']

#re.search("正则表达式","字符串")只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
print(re.search('alex|sb','123213alexsbsadfsadfasdfegonalexsbegon').group())
#====>alex
print(re.search('^alex','123213alexsbsadfsadfasdfegonalexsbegon'))
#===>None^匹配开头
print(re.search('^alex','alexsbsadfsadfasdfegonalexsbegon').group())
#===>alex

#re.match("正则表达式","字符串")
#从字符串开始处进行匹配,完全可以用search+^代替match返回值同search,
print(re.match('alex','alexsbsadfsadfasdfegonalexsbegon').group())
#====>alex
print(re.match('alex','123213alexsbsadfsadfasdfegonalexsbegon'))
#====>None#字符串开头匹配不上,则不往后匹配


#re.split("分隔符","字符串")按分隔符分割字符串,放入列表中;特殊符号需要转义后才能当作分隔符
info='a:b:c:d'
print(info.split(':'))
#==>['a','b','c','d']
print(re.split(':',info))
#==>['a','b','c','d']

#re.split("[多个分隔符]","字符串")特殊符号需要转义后才能当作分隔符,依次按分隔符分字符串,放入列表中
info=r'get:a.txt\3333/rwx'
print(re.split('[:\\\/.]',info))
#==》['get','','a','txt','3333','rwx']


#替换re.sub("需要替换的字符","替换后的字符","字符串",替换次数)
print('egonisbeutifullegon'.replace('egon','EGON'))
#==>EGONisbeutifullEGON
print('egonisbeutifullegon'.replace('egon','EGON',1))
#==>EGONisbeutifullegon
print(re.sub('egon','EGON',"egonisbeutifullegon"))
#==>EGONisbeutifullEGON
print(re.sub('egon','EGON',"egonisbeutifullegon",1))
#==>EGONisbeutifullegon

#替换与分组\1对应着第一个分组,\2对应着第二个分组,\3对应着第三个分组,\4对应着第四个分组\5对应着第五个分组
print(re.sub('(Joy)(.*?)(good)',r'\3\2\1',r'Joyisgood'))
#===>goodisJoy

print(re.sub('(.*?)(egon)(.*?)(egon)(.*?)',r'\1\2\3EGON\5','123egonisbeutifullegon123'))
#(123)--->\1
#(egon)--->\2
#(isbeutifull)-->\3
#(egon)--->\4
#(123)--->\5
#====>123egonisbeutifullEGON123



print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)',r'\5\2\3\4\1',r'lqzzzz123+isSB'))
#(lqzzzz)(123+)(is)()(SB)
#===>SB123+islqzzzz

#re.subn("需要替换的字符","替换后的字符","字符串"))返回替换结果和总共替换的个数
print(re.subn('a','A','alexmakelove'))
#===》('AlexmAkelove',2)

#re.compole("正则表达式")指定匹配规则,后续使用中可以在多个方法中都是用这个正则表达式,不用重复写
pattern=re.compile('alex')
print(pattern.findall('alexisalexalex'))
#===>['alex','alex','alex']
print(pattern.findall('alexasdfsadfsadfasdfasdfasfdisalexalex'))
#===>['alex','alex','alex']











运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-450213-1-1.html 上篇帖子: windows7 python3.63使用selenium+webdriver 实现自动登录使用过程 下篇帖子: python-异常处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表