导入re
import re
常用的元字符
匹配单个字符
. | 匹配任意除换行符以外的字符 |
\w | 匹配任意字母或数字或下划线字符 |
\s | 匹配任意的空白字符 |
\d | 匹配数字字符 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\W | 匹配非宇母或数字或下划线字符 |
\D | 匹配非数字字符 |
\S | 匹配非空白符 |
a|b | 匹配字符a或字符b |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
匹配开头结尾
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
量词
作用:用于设定对单个字符匹配的次数
* | 重复零次或更多次 |
+ | 重复⼀次或更多次 |
? | 重复零次或⼀次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
贪婪匹配和惰性匹配
.* | 贪婪匹配,尽可能多地字符 |
.*? | 惰性匹配,尽可能少地字符 |
方法
re.findall
查找所有与正则表达式匹配的字符
返回列表
lst = re.findall("m", "mai le fo len, mai nimei!")
print(lst) # ['m', 'm', 'm']
re.finditer
和findall差不多
返回一个迭代器
it = re.finditer("m", "mai le fo len, mai ni
mei!")
for el in it:
print(el.group()) # 需要分组
'''
m
m
m
'''
re.search
对文本进⾏匹配
如果匹配到了第⼀个结果,就会返回这个结果
如果匹配不上,search则返回None
ret = re.search(r'\d', '5点之前,你要给我5000块').group()#获取所有匹配结果
print(ret) # 5
re.match
只能从字符串的开头进⾏匹配
如果起始位置的字符与正则不匹配,match() 就返回 None
否则,返回与之匹配的字符
ret = re.match('a', 'abc').group()
print(ret) # a
re.compile()
可以将⼀个正则表达式进⾏预加载,⽅便后⾯的使⽤
obj = re.compile(r'\d{3}') # 将正则表达式编译成为⼀个正则表达式对象, 规则要匹配的是3个数字
ret = obj.search('abc123eeee') # 正则表达式对象调⽤search, 参数为待匹配的字符串
print(ret.group()) # 结果: 123
group的使用
-
group() 同group(0)就是匹配正则表达式整体结果
-
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分
import re
a = "123HelloWorld123"
print(re.search("([0-9]*)([a-zA-Z]*)([0-9]*)",a).group(0)) #123HelloWorld123,返回整体
print(re.search("([0-9]*)([a-zA-Z]*)([0-9]*)",a).group(1)) #123
print(re.search("([0-9]*)([a-zA-Z]*)([0-9]*)",a).group(2)) #HelloWorld
r的作用
正则表达式使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\"。前两个和后两个分别用于在编程语言里转义成两个反斜杠,然后在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,Python中字符串前⾯加上 r 表示原⽣字符串。
匹配模式
用于控制正则表达式的匹配方式,如:是否区分大小写
re.I | 忽略大小写 |
re.M | 多行模式,影响 ^ 和 $ |
re.S | 单行模式,匹配包括换行符在内的任意字符 |
re.I
import re
string = '''#Hello Python
'''
obj = re.compile(r'hello',re.I)# re.I
ret = obj.findall(string)
print(ret)#['Hello']
re.M
将字符串按照'\n'切成单行,每次都从每行的第一个字符开始匹配
影响 ^ 和 $
import re
string = '''<div>
hate xxx
love python
love c
love c++
</div>
'''
obj1 = re.compile(r'^love', re.M) # re.M 多行模式
ret1 = obj1.findall(string)
print(ret1)#['love', 'love', 'love']
obj2 = re.compile(r'^love') # re.S 默认单行模式
ret2 = obj2.findall(string)
print(ret2)#[]
re.S
import re
string = '''<div>
hate xxxx
love python
love c
love c++
</div>
'''
obj1 = re.compile(r'python.*?c')
ret1 = obj1.findall(string)
print(ret1)#[]
obj2 = re.compile(r'python.*?c',re.S) # re.S模式
ret2 = obj2.findall(string)
print(ret2)#['python\nlove c']