Python正则表达式

匹配单个字符与数字

格式含义
.匹配除换行符以外的任意字符
[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'))# <re.Match object; span=(0, 4), match='1232'>
print(re.match('\d+', '1232abc123').group())# 1232 group()获取匹配的内容
print(re.match('\d+', '1232abc123').span())#  (0, 4) span()获取匹配的下标
print(re.match('\d+', 'abc123'))# None

2 search

print(re.search('\d+', 'asf123a456'))# <re.Match object; span=(3, 6), match='123'>
print(re.search('\d+', 'asf123a456').span())# (3, 6)
print(re.search('\d+', 'asf123a456').group())# 123
print(re.search('\d+', 'abcdefg'))# None

3 findall

print(re.findall('google', 'google'))# ['google']
print(re.findall('google', 'google 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', 'b', 'c', 'd', 'e', 'f']
a = re.split(r'(?:;|,|\s)\s*',line)
print(a)# ['a', 'b', 'c', 'd', 'e', 'f']

5 sub

print(re.sub('\s','-','我是 你 爹'))# 我是-你-爹
print(re.subn('\s','-','我是 你 爹'))# ('我是-你-爹', 2)

正则修饰符

关键字作用
re.S让点匹配到换行
re.I忽略大小写
re.M能够匹配到换行
import re
print(re.search(r'4.*a', 'sa4sssd\nsfda'))# None
print(re.search(r'4.*a', 'sa4sssd\nsfda', re.S))# <re.Match object; span=(2, 12), match='4sssd\nsfda'>

print(re.search(r'a', 'sdfdAssd', re.I).group())# A
s = '''
i am ok
yes thank you
thank
'''
print(re.findall(r'\w+k', s, re.M))# ['ok', 'thank', 'thank']

贪婪模式和非贪婪模式

# 在python的正则表达式里,默认是贪婪模式,尽可能多的匹配
# 在贪婪模式后面加?,可以将贪婪模式转换为非贪婪模式
import re

print(re.search(r'j.*a', 'jsasfsdfasd'))# <re.Match object; span=(0, 9), match='jsasfsdfa'>
print(re.search(r'j.*?a', 'jsasfsdfasd'))# <re.Match object; span=(0, 3), match='jsa'>

x1 = re.search(r'aa(\d+)','aa2343ddd')
print(x1.group())# aa2343
print(x1.group(1))# 2343

x2 = re.search(r'aa(\d+?)','aa2343ddd')
print(x2.group())# aa2
print(x2.group(1))# 2

x3 = re.search(r'aa(\d+?)ddd','aa2343ddd')
print(x3.group())# aa2343ddd
print(x3.group(1))# 2343

x4 = re.search(r'aa(\d+?)(.*)','aa2343ddd')
print(x4.group())# aa2343ddd
print(x4.group(1))# 2
print(x4.group(2))# 343ddd

x5 = re.search(r'aa(\d?)(.*)','aa2343ddd')
print(x5.group())# aa2343ddd
print(x5.group(1))# 2
print(x5.group(2))# 343ddd

练习

#取出字符串里的正数、负数还有小数
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=' ')# -3.14 87 19 -0.1 111111 0 10.12 0 0.12 
print()
print(re.findall(r'-?(?:0|[1-9]\d*)(?:\.\d+)?', x))
# ['-3.14', '87', '19', '-0.1', '111111', '0', '10.12', '0', '0.12']
# 用户名匹配
# 用户名只能包含数字字母下划线 2.不能以数字开头 3.长度在6到16这个范围内
name = input('请输入用户名:')
if re.fullmatch(r'[a-zA-Z_][0-9a-zA-Z_]{5,15}', name):
    print('用户名输入正确')
else:
    print('用户名输入错误')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值