python正则表达式
基于re模块
import re
正则表达式比较复杂也很实用,下面是正则表达经常用的一些方法
match方法
从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空。
s ='python itheima python itheima python itheima'
result re.match('python',s)
print(result) #<re.Match object;span=(0,6),match='python'>
print(result.span()) #(0,6)
print(result.group()) #python
S='1pythor itheima python itheima python itheima'
result = re.match('python',s)
print(result) #None
search方法
搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后;若找不到则返回None
s='1pythonni33ni'
result=re.search('python',s)
print(result.span()) #(1,7)
print(result.group()) #python
s='hello,world'
result=re.search('python',s)
print(result.group()) #None
findall()方法
匹配整个字符串,找出全部匹配项,返回一个列表;若是没有,则返回一个空列表
s='12python66helloworldpython77'
result=re.findall('python',s)
print(result.group()) #['python',python]
result1=re.findall('nihao',s)
print(result1.group()) #[]
单字符匹配
字符 | 功能 |
---|
. | 匹配任意1个字符(除了\n), \. 匹配点本身 |
[] | 匹配[]中列举的字符 |
[^] | 匹配除了[]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空格、tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即-Z、A-Z、0-9、- |
\W | 匹配非单词字符 |
s='12#_python66helloworldpython77'
#找出全部数字
result=re.findall(r'\d',s) #['1','2','6','6','7','7']
#找出全部的英文字母
result1=re.findall(r'[a-zA-Z]',s)
#找出指定的几个
result2=re.findall(r'[paw2]')
数量匹配
字符 | 功能 |
---|
* | 匹配前一个规则的字符出现0至无数次 |
+ | 匹配前一个规则的字符出现1至无数次 |
? | 匹配前一个规则的字符出现0次或1次 |
{m} | 匹配前一个规则的字符出现m次 |
{m,} | 匹配前一个规则的字符出现最少m次 |
{m,n} | 匹配前一个规则的字符出现m到n次 |
边界匹配
字符 | 功能 |
---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词的边界 |
分组匹配
字符 | 功能 |
---|
| | 匹配左右任意一个表达式 |
() | 将括号中字符作为一个分组 |
#匹配账号,只能由字母和数字组成,长度限制为6到10位
r = '^[0-9a-zA-Z]{6,10}$' #不可以用\w,因为\w包括_
s='123456ab'
s1='1234567jdngksl'
print(re.findall(r,s)) #['123456ab']
print(re.findall(r,s1)) #[]
#匹配qq号,要求纯数字,长度为5-11位,第一位不为0
r1='[1-9][0-9]{4,10}'
r2='^[1-9][0-9]{4,10}$'
s1='0123456'
s2='1234567'
print(re.findall(r1,s1)) #['123456']
print(re.findall(r2.s1)) #[]
print(re.findall(r2,s2)) #['1234567']
贪婪匹配和惰性匹配
字符 | 功能 |
---|
.* | 贪婪匹配,尽可能匹配多 |
.*? | 惰性匹配,尽可能匹配少 |
s='玩吃鸡游戏,晚上一起打游戏,干嘛呢,打游戏呢'
r1='玩.*游戏'
r2='玩.*?游戏'
print(re.match(r1,s).group()) #玩吃鸡游戏,晚上一起打游戏,干嘛呢,打游戏
print(re.match(r2,s).group()) #玩c
#这种匹配方式在爬虫解析hmtl中很常用
s1='在干嘛,玩王者游戏,还是吃鸡游戏,一起打游戏吗'
obj1=re.compile(r'嘛,玩(?P<name>.*?)游戏',re.S)
obj2=re.compile(r'嘛,玩(?P<name>.*)游戏',re.S)
result1=obj1.search(s1).group('name')
result2=obj2.search(s1).group('name')
print(result1) >>>王者
print(result2) >>>王者游戏,还是吃鸡游戏,一起打