匹配单个字符与数字
格式 |
含义 |
. |
匹配除换行符以外的任意字符 |
[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('用户名输入错误')