import re
1、findall 查找所有. 返回list
string = '我是身高为170的女孩'
ex = "\d+" # 正则表达式
# 第一个参数:表达式,第二个:被匹配的目标值,返回个list,第三个:re.S用来处理回车,忽略回车
print(re.findall(ex,string,re.S))
2、 search会进⾏匹配. 但是如果匹配到了第⼀个结果. 就会返回这个结果. 如果匹配不上search返回的则是None
ret = re.search(r'\d', '5点之前. 你要给我5000万').group()
print(ret)
ex = '(?P<id>\d*)' # ?P<id> 表示匹配出来的数据命名为id
ret = re.search(ex, '5点之前. 你要给我5000万').group('id')
print(ret)
3、match 只能从字符串的开头进⾏匹配
ret = re.match('a', 'abc').group()
print(ret)
4、finditer, 和findall差不多. 只不过这时返回的是迭代器
it = re.finditer("m", "mai le fo len, mai nimei!")
for el in it:
print(el.group()) # 依然需要分组
5、compile() 可以将⼀个⻓⻓的正则进⾏预加载. ⽅便后⾯的使⽤
obj = re.compile(r'\d{3}') # 将正则表达式编译成为⼀个 正则表达式对象, 规则要匹配的是3个数字
ret = obj.search('abc123eeee') # 正则表达式对象调⽤search, 参数为待匹配的字符串
print(ret.group()) # 结果: 123
常用的正则表达式
一、匹配字符:
. 匹配除换⾏符以外的任意字符
\w 匹配字⺟或数字或下划线
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配⾮字⺟或数字或下划线
\D 匹配⾮数字
\S 匹配⾮空⽩符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示⼀个组
[ABC] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
二、量词: 控制前⾯的元字符出现的次数
* 重复零次或更多次
+ 重复⼀次或更多次
? 重复零次或⼀次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
三、贪婪匹配和惰性匹配
.* 贪婪匹配, 尽可能多的去匹配结果
.*? 惰性匹配, 尽可能少的去匹配结果
部分示例
import re
string = '我是身高为170的女12孩1'
ex = "\d+" # \d提取数字,返回数字列表,+号表示将在一起的数字拼接起来
print(re.findall(ex,string))
string = 'https,http'
ex = "https?" # 匹配http,或者https,?表示左侧的字符出现0-1次
print(re.findall(ex,string))
string = '这是手机号13403484838'
ex = "1[3,5,6,7,8,9]\d{9}" #第1位是1,第二位是3,5,6,7,8,9,后面是9位数
print(re.findall(ex,string))
string = ' 玩⼉吃鸡游戏, 晚上⼀起上玩儿游戏, ⼲嘛呢? 打游戏'
ex = "玩⼉.*游戏" #贪婪模式,尽量后面匹配,这样提取的数据就多,所以叫贪婪
ex = "玩⼉.*?游戏" #惰性模式,尽量往前匹配,这样就得到的数据就少
print(re.findall(ex,string))
string = ' 玩⼉吃鸡游戏, 晚上⼀起上玩儿游戏, ⼲嘛呢? 打游戏'
ex = "玩⼉(.*?)游戏" #加上(),就只返回()内的数据
print(re.findall(ex,string))