正则表达式是独有的工具:用来匹配或者提取字符串
不属于Python基础
属于编程基础。
注意开头要导入
import re
1、findall方法:
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表 ,如果没有找到匹配的,则返回空列表
2、match方法
re.match 尝试从字符串的起始位置匹配一个模式,匹配成功 返回的是一个匹配 对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话, match()返回的是空,
注意:match只能匹配到一个
a = "python123123java"
print(re.match('python',a))
print(re.match('python',a).group())# 查看匹配的字符
print(re.match('123',a))
print(re.match('python',a).span())# 匹配字符的下标取值区间
3、search方法
re.search 扫描整个字符串,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息)
注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找
print(re.search('123',a))# yes
print(re.search('cc',a))# None
print(re.search('python',a).group())
print(re.search('python',a).span())
re.match与re.search的区别: re.match只匹配字符串的开始位置找,如果字符串开始不符合正则表达式,则匹配失败, re.search:匹配整个字符串,如果一直找不到则,返回是空的,没有结果
4、元字符
单字符匹配
字符 | 描述 |
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配 [ ] 中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键 |
\S | 匹配非空白 |
\w | 匹配单词符,即a-z、A-Z、0-9 |
\W | 匹配非单词字符 |
注意使用时转义(转义就是在前面加r)
例子在下一个代码段
代表数量的元字符
字符 | 描述 |
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现0次或者1次,即要么有1次,要么没有 |
{x} | 匹配前一个字符出现x次 |
{x,} | 匹配前一个字符至少出现x次 |
{x,y} | 匹配前一个字符出现从m到n次 |
b = '张三天在玩4399小游戏,张三 hello 玩的.很开心'
ress = re.findall(r'张三.',b)# .任意一个字符
ress1 = re.findall(r'[54]',b)
ress1 = re.findall(r'\d',b)# 匹配数字,单个字符,单个元素
ress1 = re.findall(r'\D',b)#
ress1 = re.findall(r'4*',b)# 匹配前一个字符出现0次或者无限次,即可有可无
ress1 = re.findall(r'4+',b)# 匹配前一个字符出现1次或者无限次,即可有可无
ress1 = re.findall(r'三{2}',b)# 匹配前一个字符出现m次
ress1 = re.findall(r'三{1,}',b)# 匹配前一个字符出现从m到n次
ress1 = re.findall(r'三{1,2}',b)# 匹配前一个字符出现从m到n次
ress1 = re.findall(r'^张三',b)# 匹配字符串开头
ress1 = re.findall(r'心$',b)# 匹配字符串结尾
ress1 = re.findall(r'\bhello\b',b)# 匹配一个单词的边界
ress1 = re.findall(r'he\Bll',b)# 匹配一个单词的边界
ress1 = re.findall(r'he\Bll',b)# 匹配一个单词的边界
print(ress1)
字符 | 描述 |
| | 可以理解或者 |
() | 将括号中的字符作为一个分组 |
a = "a+bhelloa-bhello"
b = re.findall(r"a\+b|a-b",a)
print(b)
#打印出来会是 a+b a-b
5、贪婪和非贪婪
正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据,
在非贪婪模式下,始终找最短匹配
在爬虫中会使用
a = '<a>啦啦</a><a>好</a><a>不好</a><a>嗯</a>'
print(re.findall(r'<a>(.*)</a>',a))# 贪婪
#这样打印出来的结果会是 啦啦</a><a>好</a><a>不好</a><a>嗯
#相当于去头和尾
print(re.findall(r'<a>(.*?)</a>',b))# 加上?变成非贪婪
#这样打印出来的结果会是 啦啦 好 不好 嗯
#只取括号里面的文字
#这个括号的意思的可以理解为 只取括号里面的内容左右不保存
这里的?和元字符的不一样
这个问号可以这样理解:
有人给你选择100 10 1
贪婪会选择100甚至更多,在你给我的选项里我选择最多的那个
相反非贪婪就是选择最少