匹配单个字符与数字
格式 含义 . 匹配除换行符以外的任意字符 [0123456789] []是字符集合,表示匹配方括号中所包含的任意一个字符 [good] 匹配good中任意一个字符 [a-z] 匹配任意小写字母 [A-Z] 匹配任意大写字母 [0-9] 匹配任意数字,类似[0123456789] [0-9a-zA-Z] 匹配任意的数字和字母 [0-9a-zA-Z_] 匹配任意的数字、字母和下划线 [^good] 匹配除了good这几个字母以外的所有字符,中括号里的^称为脱字符,表示不匹配集合中的字符 [^0-9] 匹配所有的非数字字符 \d 匹配数字,效果同[0-9] \D 匹配非数字字符,效果同[^0-9] \w 匹配数字,字母和下划线,效果同[0-9a-zA-Z_] \W 匹配非数字,字母和下划线,效果同[^0-9a-zA-Z_] \s 匹配任意的空白符(空格,回车,换行,制表,换页),效果同[ \r\n\t\f] \S 匹配任意的非空白符,效果同[^ \f\n\r\t]
锚字符(边界字符)
格式 含义 ^ 行首匹配,和在[]里的^不是一个意思 $ 行尾匹配 \A 匹配字符串开始,它和^的区别是,\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首 \Z 匹配字符串结束,它和$的区别是,\Z只匹配整个字符串的结束,即使在re.M模式下也不会匹配它行的行尾 \b 匹配一个单词的边界,也就是值单词和空格间的位置 \B 匹配非单词边界
匹配多个字符
说明:下方的x、y、z均为假设的普通字符,n、m(非负整数),不是正则表达式的元字符
格式 含义 (xyz) 匹配小括号内的xyz(作为一个整体去匹配) x? 匹配0个或者1个x x* 匹配0个或者任意多个x(.* 表示匹配0个或者任意多个字符(换行符除外)) x+ 匹配至少一个x x{n} 匹配确定的n个x(n是一个非负整数) x{n,} 匹配至少n个x x{n,m} 匹配至少n个最多m个x。注意:n <= m x|y |表示或,匹配的是x或y
特殊
格式 含义 *? +? x? 最小匹配, 通常都是尽可能多的匹配,可以使用这种解决贪婪匹配 (?:x) 非捕获性分组
re模块
常用方法:
方法 作用 re.match() 从开头开始匹配,没有匹配到就返回None re.search() 只匹配第一个符合条件的子字符串,没有匹配到就返回None re.fullmatch() 完全匹配和^$效果一样 re.findall() 获取所有与正则匹配的内容,返回的是是一个列表 re.finditer() 同样是获取所有与正则匹配的内容,但返回的是一个迭代器 re.split() 按条件拆分字符串,返回一个列表 re.sub() 按条件进行字符串替换,并返回新的字符串 re.subn() 按条件进行字符串替换,并返回新的字符串和替换次数
模块自己导一下
1 match
print ( re. match( '\d+' , '1232abc123' ) )
print ( re. match( '\d+' , '1232abc123' ) . group( ) )
print ( re. match( '\d+' , '1232abc123' ) . span( ) )
print ( re. match( '\d+' , 'abc123' ) )
2 search
print ( re. search( '\d+' , 'asf123a456' ) )
print ( re. search( '\d+' , 'asf123a456' ) . span( ) )
print ( re. search( '\d+' , 'asf123a456' ) . group( ) )
print ( re. search( '\d+' , 'abcdefg' ) )
3 findall
print ( re. findall( 'google' , 'google' ) )
print ( re. findall( 'google' , 'google google' ) )
print ( re. findall( 'google' , 'I love you' ) )
4 split
line = 'a b; c, d,e, f'
print ( re. split( r'[;,\s]\s*' , line) )
a = re. split( r'(?:;|,|\s)\s*' , line)
print ( a)
5 sub
print ( re. sub( '\s' , '-' , '我是 你 爹' ) )
print ( re. subn( '\s' , '-' , '我是 你 爹' ) )
正则修饰符
关键字 作用 re.S 让点匹配到换行 re.I 忽略大小写 re.M 能够匹配到换行
import re
print ( re. search( r'4.*a' , 'sa4sssd\nsfda' ) )
print ( re. search( r'4.*a' , 'sa4sssd\nsfda' , re. S) )
print ( re. search( r'a' , 'sdfdAssd' , re. I) . group( ) )
s = '''
i am ok
yes thank you
thank
'''
print ( re. findall( r'\w+k' , s, re. M) )
贪婪模式和非贪婪模式
import re
print ( re. search( r'j.*a' , 'jsasfsdfasd' ) )
print ( re. search( r'j.*?a' , 'jsasfsdfasd' ) )
x1 = re. search( r'aa(\d+)' , 'aa2343ddd' )
print ( x1. group( ) )
print ( x1. group( 1 ) )
x2 = re. search( r'aa(\d+?)' , 'aa2343ddd' )
print ( x2. group( ) )
print ( x2. group( 1 ) )
x3 = re. search( r'aa(\d+?)ddd' , 'aa2343ddd' )
print ( x3. group( ) )
print ( x3. group( 1 ) )
x4 = re. search( r'aa(\d+?)(.*)' , 'aa2343ddd' )
print ( x4. group( ) )
print ( x4. group( 1 ) )
print ( x4. group( 2 ) )
x5 = re. search( r'aa(\d?)(.*)' , 'aa2343ddd' )
print ( x5. group( ) )
print ( x5. group( 1 ) )
print ( x5. group( 2 ) )
练习
x = '-3.14good87nice19bye-0.1g111111sd0jhj10.12gh00.12'
y = re. finditer( r'-?(0|[1-9]\d*)(\.\d+)?' , x)
for i in y:
print ( i. group( ) , end= ' ' )
print ( )
print ( re. findall( r'-?(?:0|[1-9]\d*)(?:\.\d+)?' , x) )
name = input ( '请输入用户名:' )
if re. fullmatch( r'[a-zA-Z_][0-9a-zA-Z_]{5,15}' , name) :
print ( '用户名输入正确' )
else :
print ( '用户名输入错误' )