正则元字符
元字符 | 描述 | 正则表示示例 |
| | 逻辑或 | foo|bar 匹配foo或者bar |
. | 任意字符(\n除外) | b.b |
^ | 字符串起始部分(开头) | ^bob 以bob开头的字符串 |
$ | 字符串起始部分(结尾) | bob$ 以bob结尾的字符串 |
+ | 前导符,前面字符出现一次或多次 | [a-z]+\.com a-z字母加.com |
* | 前导符,前面字符出现0次或多次 | [0-9]* ,出现任意数量的数字 |
? | 前导符,前面字符出现1次或0次 | [a-z]? 出现一个字母或不出现 |
{n} | 前导符,前面字符出现n次 | [a-z]{n},前面出现多个字符 |
{n,m} | 前导符,前面字符最少出现n次,最多m次 | [a-z]{6,9} ,单个字母,最少出现6次,最多9次 |
[] | 范围内的任意一个字符 | [abdg] 括号中字符的任意一个 |
[a-zA-Z0-9] | 范围内任一一个字符 | |
(*|+|?|{})? | 非贪婪匹配 | |
() | 匹配封闭的正则表达式,然后存为组 | |
\d | 十进制数字0-9 \D 取反 | data\d+.txt |
\w | 字母和数字。类似于[a-zA-Z0-9],\W取反 | [a-zA-Z]\w+ |
\s | 空格 \S取反 | of\sthe 匹配of the |
\b | 词边界 \B取反 | \bthe\b 匹配the单词 |
其中注意:
\d 表示十进制数字0-9 (\D) 取反
\w 表示全部字母和数字,相当于[a-zA-Z0-9] (\W)取反
\s 表示空格
Python re正则模块
group() 要么返回整个匹配对象,要么根据要求返回特定的子组
groups() 则仅仅返回一个包含唯一或全部子组的元祖,如果没有子组的要求,那么返回一个空元祖
match() 匹配成功,则返回一个匹配对象,如果失败,返回一个None
re模块中基本功能:
一、查找
1、findall 匹配所有中每一项符合的结果都会放到列表中作为一个元素
用法:re.findall(正则,带匹配字符串,flag)
res = re.findall('\d+','我今年快20岁了,但是身高不到180里面')
print(res)
#返回列表['20','80']
2、search 只匹配符合条件的从左到右的第一个,得到是一个变量。通过这个变量的group方法来获取结果如果没有匹配到,则返回None,group方法会报错
var = '我今年快20岁了,但是身高不到180里面'
res = re.findall('\d+',var)
print(res)
#
#返回列表['20','80']
res1 = re.search('\d+',var)
res2 = re.search('_',var)
print(res1.group()) #得到20,注意要通过group方法来获取结果
# print(res2.group()) #会报错
3、match 从头开始匹配,相当于在search中加上一个 '^'
res3 = re.match('\d+',var)
res4 = re.match('\d+','20岁了我,身高却不到183')
print(res3) #返回none
print(res4.group()) #返回20
二、字符串处理 (切割和替换)
1、split 切割
var = '我今年快20岁了,但是身高不到180里面'
res = re.split('\d+',var)
print(res) #得到['我今年快', '岁了,但是身高不到', '里面']
2、sub 替换 (正则,‘替换成新字符’,替换次数(默认全部替换))
var = '我今年快20岁了,但是身高不到180里面'
res = re.sub('\d+','uzi',var)
print(res) #我今年快uzi岁了,但是身高不到uzi里面