一、常用基本元字符
. 匹配除换行符以外的任意字符 ,一次只能匹配一个字符
\w 匹配字母或数字或下划线, 比如:a3_
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符, 比如[a-zA-Z0-9],只能匹配到1个字母或1个数字
[...]+ 匹配字符组中的字符出现多次
[...]{m} 匹配字符组中的字符出现m次
[^...] 匹配除了字符组中字符的所有字符
2、常用量词(用来修饰前面一个单位出现的次数)
* 重复零次或更多次,前面可以有也可以没有都能匹配到
+ 重复一次或更多次,比如 [a-zA-Z0-9]+,允许某一段内容[alex123AD]出现一次或多次的字母和数字。
比如 [9]+,允许9出现一或多次
比如 [a-z]+,允许a-z出现一或多次
比如 [0-9]{3},允许0-9出现3次,例如: '435'
? 重复零次或一次,前面可以没有或者只能有一次
{n} 重复n次,比如9{3}表示匹配3个9,例如:'999',
{n,} 重复n次或更多次,比如9{3,}表示最少匹配3个9,或更多,例如:'999' '9999'
{n,m} 重复n到m次,比如9{2,4}表示匹配2-4个9, 例如:'99' '999' '9999'
3、常见组合用法
(1) 匹配'[email protected]'
思路:
[]+@[]+\.[]+
结果:
[a-zA-Z0-9]+@[0-9]+\.[a-z]+
[\w]+@[\d]+\.[\w]+
(2) 贪婪匹配,尽可能多的匹配
X.*Y: 从 "X" 开始匹配 -> 中间是任意内容 -> 一直匹配到最后一个(最远的那个) "Y"
匹配 111X111Y111YYY111YY111
结果是 X111Y111YYY111YY
<.*>: 从 "<" 开始匹配 -> 中间是任意内容 -> 一直匹配到最远的那个 ">"
匹配 111232>22222>33333111232>22222>
(3) 惰性匹配(非贪婪匹配),尽可能少的匹配
X.*?Y: 从 "X" 开始匹配 -> 中间是任意内容 -> 一直匹配到最近的那个 "Y"
匹配 111X111Y111YYY111YY111
结果是 X111Y
<.*?>: 从 "<" 开始匹配 -> 中间是任意内容 -> 一直匹配到最近的那个 ">"
匹配 111232>22222>33333
\d?Y: 不算惰性匹配, \d+?Y才算惰性匹配
(4) ^0a1.*z$ 匹配以0a1开头以z结尾的内容
二、re模块(结合正则使用)
一、re模块是python提供的处理正则表达式模块
1、findall 查找
# 查找字符串中的数字
import re
lst = 'alex age 23'
s = re.findall(r'\d+', lst)
s = re.findall(r'[0-9]+', lst)
print(s)
---------------------
['23']
import re
lst = 'My naMe is alex,my age is 23,my phone is 13323234451'
# 匹配到第一个'M'就停止匹配,group()表示分组展示
s = re.search('M', lst).group()
# 匹配到第一个数字就停止匹配,‘\d’表示数字,r表示转义
import re
lst = 'alex age 23'
s = re.search(r'\d', lst).group()
s = re.search(r'[0-9]', lst).group()
print(s)
---------------------------------
2
3、match 只匹配以指定内容开头的部分
import re
lst = 'My naMe is alex,my age is 23,my phone is 13323234451'
# 匹配字符串开头的部分
s = re.match('My', lst).group()
print(s)
---------------------------------------
My
# 匹配数字开头的部分
import re
lst = '22 alex age 23'
s = re.match(r'\d+', lst).group()
print(s)
--------------------------
22
4、finditer 与 findall差不多,只不过返回的是迭代器
# 匹配数字
import re
lst = '22 alex age 23'
s = re.finditer(r'\d+', lst) # s是迭代器
print(s.__next__().group()) # 通过.group()才能拿到数据
for i in s:
print(i.group())
---------------------------------------------
22
23
5、split 切割
(1) 将字符串以'is'进行分割
import re
lst = 'My naMe is alex,my age is 23,my phone is 13323234451'
s = re.split('is', lst)
print(s)
-------------------------------------
['My naMe ', ' alex,my age ', ' 23,my phone ', ' 13323234451']
(2) 将字符串以'a'和'c'进行分割
import re
lst = '13323a234c451'
s = re.split('[ac]', lst)
print(s)
---------------------------------------
['13323', '234', '451']
6、compile 将正则表达式匹配的内容定义成正则变量
(1) # 将正则表达式匹配的内容定义成正则变量,匹配规则是3个数字
import re
obj = re.compile(r'\d{3}',re.S) # obj是一个写好的正则:代表匹配3个数字,r表示转义里面的"\", re.S运行换行匹配
s1 = obj.search('sdf23as444sss').group() # 调用obj结合search()对字符串进行匹配
print(s1)
-------------------
444
# 也可以写成这样
obj = re.compile(r'\d{3}',,re.S).search('sdf23as444sss').group()
print(obj)
--------------------------------------------
444
(2) 匹配字符串中的'www.baidu.com'
lst = 'www.baidu.com, www.jd.com, www.taobao.com' #被匹配的字符串
obj = re.compile(r'www\.baidu\.com',re.S) # 定义正则:匹配'www.baidu.com'
s2 = obj.findall(lst) # 用定义好的正则去列表里面匹配
print(s2)
------------------------------------
['www.baidu.com']
(3) 只匹配括号里面的内容,通过findall()去拿数据
import re
lst = 'www.baidu.com, www.jd.com' # 被匹配的字符串
obj = re.compile(r'www\.(baidu|jd)\.com',re.S) #定义正则:匹配到'www.baidu.com'或'www.jd.com'后只拿括号内的
s2 = obj.findall(lst) # 用定义好的正则去目标中匹配内容
print(s2)
-------------------------------------
['baidu', 'jd']
(4) 只匹配括号里面的内容,通过finditer()分组去拿数据
import re
# 被匹配目标
lst = 'www.baidu.com, www.jd.com, www.taobao.com' #
# 定义正则:匹配到'www.baidu.com'或'www.jd.com'后只拿括号里的内容,拿到内容后分组赋值给变量names
# 格式 (?P<变量名>匹配内容)
obj = re.compile(r'www\.(?Pbaidu|jd)\.com',re.S)
# 用定义好的正则去目标中匹配(s2是迭代器)
s2 = obj.finditer(lst)
# 通过for循环拿到迭代器里面的数据,并使用group('变量名')才能拿到数据
for i in s2:
print(i.group('names'))
--------------------------------------------
baidu
jd
7、sub 替换
格式:re.sub(‘替换前’, ‘替换后’, 对谁替换)
(1) 将字符串中的所有数字替换成 '**'
import re
lst = 'ab1c23de33fg23hi4jk'
s = re.sub(r'\d+','**', lst)
print(s)
-----------------------------------
ab**c**de**fg**hi**jk
(2) 将字符串中的所有'ab'转换成 'AB'
import re
lst = 'abcdefab'
s = re.sub('ab','AB', lst)
print(s)
---------------------------------
ABcdefAB
8、subn 替换并报告替换次数
# 将字符串中的所有数字替换成 '__',并报告替换次数
import re
lst = 'ab1cd2ef3ab'
s = re.subn(r'\d+','__', lst)
print(s)
-----------------------------------
('ab__cd__ef__ab', 3)