Python3 正则表达式

2019-03-11 09:46:14来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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))

输出结果:

æ­¤å?¾å??ç??altå±?æ?§ä¸ºç©ºï¼?æ??件å??为image-111.png

<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 标准库:calendar,time

下一篇:Note of Python Turtle