Python3 正则表达式
2019-03-11 09:46:14来源:博客园 阅读 ()
1.导入正则表达式模块
import re
2.匹配数字
print(re.findall('[0-9]','qwe21ewq'))
输出结果:
3.匹配字符
print(re.findall('[a-zA-Z]','abC'))
输出结果:
匹配-,只需要令-挨着[就可以,不需要进行转义.如果-没有挨着[才需要进行转义
print(re.findall('[-0-9]','qw-e21ewq'))
输出结果:
排除字符
print(re.findall('[^0-9]','qw-e21ewq'))
输出结果:
如果想要匹配’^’,只需要’^’不挨着'[‘就行,如果挨着'[‘,就需要进行转义
4.概括字符集
\d=[0-9] digit
\w=[0-9a-zA-Z] word还可以匹配下划线
\s=[\t\r\n\v\f] space 制表符,回车符,换行符
\D,\W,\S分别与\d,\w,\s相反
.可以匹配任意字符除了换行符\n
5.数量词
print(re.findall(r'\d{3,5}','qw-e21231ewq'))
输出结果:
数量词用法
\d{6} 出现6次数字
\d{4,6} 数字出现4-6次
\d{4,} 数字出现4-65536次
\d{0,6} 数字出现0-6次
*={0,}
+={1,}
?={0,1}
数量词默认用法是贪婪,如果在数量词后面加’?’,进行非贪婪
print(re.findall(r'\d{3,5}?','qw-e21231ewq'))
输出结果:
6.定界符
print(re.findall(r'^\d{5}$','qw-e21231ewq'))
结果就是匹配不到,因为’^’代表从起始位置开始,’$’代表到末尾为止,所以这个字符串不能匹配
\A也代表从起始位置开始,\Z代表到结束位置开始,与$不同的是,\Z在匹配多行字符串时,只匹配整个字符串的结束位置,而不匹配中间的字符串的结束位置.
7.re.match和re.search
re.match(pattern,string[,flags] )和re.search(pattern,string[,flags])的区别是:
match是默认从字符串的起始位置开始的,而search就没有这个限制
print(re.match('\d{3}','a123'))
print(re.search('\d{3}','a123'))
输出结果:
8.group分组
print(re.search('(\d{3})a(\w)','a123abc').group())
print(re.search('(\d{3})a(\w)','a123abc').group(1))
print(re.search('(\d{3})a(\w)','a123abc').group(2))
输出结果:
9.re.findall
re.findall(pattern,string[,flags])以列表的形式返回所有符合条件的元素
print(re.findall('\d{5}','a21231casd12345'))
输出结果:
10.re.sub
字符串替换
re.sub(pattern,replacement,string)
print(re.sub('\d{5}','*','abc126322defg'))
输出结果:
第二个参数位置也可以传入一个函数,用来替换成更复杂的字符
def rpl(value):
rp=value.group()
if int(rp)<5:
return ''
else:
return '!'
print(re.sub(r'\d{5}',rpl,'abc126322defg'))
输出结果:
11.括号的作用
(1)分组
print(re.findall('(ab)+','aab'))
输出结果:
如果不加括号的话,就是要求’b’出现1次以上,而不是’ab’
(2)多选结构
print(re.findall('(\d{3}|[a-z]{3})','123abc'))
输出结果:
(3)引用分组
<1>引用分组
print(re.search('(\d{3})a(\w)','a123abc').group())
print(re.search('(\d{3})a(\w)','a123abc').group(1))
print(re.search('(\d{3})a(\w)','a123abc').group(2))
输出结果:
<2>反向引用
匹配重复的字母
print(re.findall(r'^([a-z])\1$','dd'))
输出结果:
\1代表重复前面的分组1
<3>命名分组
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group())
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('year'))
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('month'))
print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('day'))
输出结果:
<4>非捕获分组
print(re.search('(?:\d{3})a(\w)','a123abc').group())
print(re.search('(?:\d{3})a(\w)','a123abc').group(1))
输出结果:
非捕获分组?:不影响匹配,但是非捕获分组不算组数
12.转义
如果是转义[a-z]或者{3},只需要\[a-z]和\{3}即可
但是如果遇到了'(‘,’)’,’|’,(两个括号一个竖线)这三个字符,需要在它们前面加上转义符
13.断言
(1)单词边界
单词边界\b,非单词边界\B
print(re.findall(r'\b\w+\b','I love Python!'))
输出结果:
(2)环视
(?!) (?<!) (?=) (?<=)
否定环视: (?!)和(?=)
肯定环视: (?<!)和(?<=)
环视的使用
例如 (?!/) 就代表匹配的字符串右边不能出现’/’
(?<!/) 就代表左边不能出现’/’
肯定环视就是指如果匹配成功,在当前位置匹配成功
否定就是指匹配成功,在当前位置匹配失败
环视的最大特点就是匹配完成之后,还会停留在原地
print(re.sub(r'(?<![a-zA-Z])\s+(?![a-zA-Z])','','I love Python! 我爱 '))
输出结果:
使用环视去掉了中英文混编时多余的空格,上面环视的意思就是匹配从某一个空白位置向左看不能出现字母,向右看也不能出现字母
14.匹配模式
1.不区分大小写
(?i)the
2.单行模式
(?s) 这种模式下.也可以匹配\n
3.多行模式
(?m)
4.注释模式
(?x)
print(re.findall(r'a','AbC',re.I))
输出结果:
15.面向对象式
使用函数re.compile()
使用方法:
digitRegex=re.compile(r"\d+")
digitRegex.findall('12 3')或
re.findall(digitRegex,"12 3")
compile还可以查看详细信息
print(re.findall(r'a','AbC',re.I))
输出结果:
原文链接:https://www.cnblogs.com/zmqqq/p/10506167.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- python学习-53 正则表达式 2019-08-13
- python3 enum模块的应用 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash