re:re是提供正则表达式匹配操作的模块
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某个模式匹配,Python 自1.5版本起增加了re模块,它提供Perl风格的正则表达式。
1、re.match()介绍
match() 试图从字符串的起始位置对模式进行匹配,如果匹配成功,就返回一个匹配对象,如果匹配失败,就返回None,匹配对象的group()方法能显示成功匹配的对象。
使用语法:
re.match(pattern,string[, flags])
参数说明
import re
ret = re.match("hello","hello word")
print(ret.group()) # 使用group()方式返回对应的分组
import re
ret = re.match("hello","ahello word")
print(ret.group()) # 匹配不成功,就返回None
2、re.search()介绍
使用语法:
re.search(pattern,string[,flags])
import re
ret = re.search("hello","ahello word") # 搜索成功
print(ret.group()) # hello
3、re.match()和re.search()的区别
import re
ret = re.search("^hello","ahello word") # 如果在hello前面加^号,其search的功能和match的功能一样
print(ret.group()) # 匹配不成功,返回None
4、re.fildall()介绍
使用语法:
re.fildall(pattern,string[,flags])
ret = re.fildall('\d+','hello123,word456')
print(ret)
结果:
>>>['123','456']
5、re.compile()介绍
使用语法:
re.compile(pattern,flags)
import re
rule = re.compile('\d+')
ret = rule.findall('hellow word456')
print(ret)
>>>456
6、re.split()介绍
使用语法:
re.split(pattern,string,maxsplit,flags)
import re
strs = 'zhangsan123wangwu345we'
set = re.split('\d+',strs)
print(set)
>>>['zhangsan', 'wangwu', 'we']
7、re.sub()介绍
使用语法:
re.sub(pattern,repl,string,count)
import re
strs = 'hello word'
ret = re.sub('hello','HELLO',strs)
print(ret)
>>>HELLO word
# 使用正则来匹配替换
strs = 'abcd123efg345hi'
ret = re.sub(r'\d+','HELLO',strs)
print(ret)
>>>abcdHELLOefgHELLOhi
8、re.subn()介绍
使用语法:
re.subn(pattern,repl,string,count)
import re
strs = 'abcd123efg345hi'
ret = re.subn(r'\d+','HELLO',strs)
print(ret)
>>>('abcdHELLOefgHELLOhi', 2) #('替换后的字符串',替换的次数)
# 指定替换的次数
import re
strs = 'abcd123efg345hi'
ret = re.subn(r'\d+','HELLO',strs,1)
print(ret)
>>>('abcdHELLOefg345hi', 1)
符号 | 描述 |
---|---|
[0-9] | 匹配数字 |
[a-z] | 匹配小写字母 |
A-Z | 匹配大写字母 |
[0-9A-z] | 匹配数字及大小写字母 |
[3-9] | 匹配小范围的数字值 |
[a-f] | 匹配小范围的字母值 |
[^abc] | 不匹配abc任意字符 |
[^a-z] | 不匹配a-z直接的任意字符 |
1[0-9] | 匹配10-19直接的数值 |
1[0-9][0-9] | 匹配100-199直接的数值 |
符号 | 描述 |
---|---|
\d | 匹配固定:0-9数值 |
\w | 匹配数字字母及下划线中文:[0-9A-z_“中文”] |
\s | 匹配空白符:空格,Tab,回车 |
\t | 匹配Tab |
\n | 匹配回车 |
\D | 匹配数字 |
\W | 匹配非数字字母下划线 |
\S | 匹配非空白符 |
. | 匹配除换行符外任意一个字符 |
^ | 匹配以某字符开头 |
$ | 匹配以某字符结尾 |
[] | 字符组(只要在[]里面的都匹配) |
[^] | 非字符组(只要在[]里面的都不匹配) |
| | 或,(如:abcdef|acb) |
() | 分组,如:^(abcdef|abc)$ |
符号 | 描述 |
---|---|
{n} | 重复n次 |
{n,} | 重复至少n次,n次以上 |
{n,m} | 重复n-m次 |
? | 0或1次 |
+ | 1到不限 |
* | 0到不限 |
表达式 | 描述 |
---|---|
a.*b | 贪婪 |
a.*?b,a.+?b | 惰性,在量词后面的?表示惰性匹配,会在符合条件的基础上尽量少的匹配其他内容 |
贪婪匹配模式
import re
lst = "\d{2,4}"
ret = re.search(lst,"12345abcd")
print(ret.group())
结果:
>>>1234
惰性匹配模式
import re
lst = "\d{2,4}?"
ret = re.search(lst,"12345abcd")
print(ret.group())
结果:
>>>12
表达式 | 描述 | 结果 |
---|---|---|
1[3-9]\d{9} | 匹配手机号 | 13888998899 |
[1-9]\d* | 匹配任意的正整数 | 143 |
\d+.\d+ | 匹配任意小数 | 12.345 |
\d+(.\d+) | 匹配整数或小数 | 12或者12.131231 |
代码 | 描述 |
---|---|
(exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写(?'name’exp) |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给次分组分配组号 |
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(? | 匹配前面不是exp的位置 |
案例1:
import re
ret = re.findall('\d(\d)','a1,b22,c345')
print(ret)
>>>[2,4]
案例2:
import re
ret = re.findall('\d(?:\d)','a1,b22,c345')
print(ret)
>>>['22','34']
案例3:
import re
ret = re.search('(?P\d)(?P\d)' ,'a14,b22,c3357')
print(ret.group()) # 14
print(ret.group(0)) # 14
print(ret.group(1)) # 1
print(ret.group(2)) # 4
print(ret.group('num1')) # 1
print(ret.group('num2')) # 4
案例4:
import re
ret = re.search('(?P\d)(?P=num1)' ,'a14,b22,c3357')
print(ret.group()) #匹配10位数,并且分组1=分组2
>>>22
import re
ret = re.search("<(?P\w)>.*(?P=tag_name)>" ,"hello<\h1>"
)
print(ret)
print(ret.group('tag_name'))
print(ret.group())
>>>h1
>>>h1
>>><h1>hello</h1>