1.元字符
# 行定位符"^"表示行的开始,"$"表示行的结尾 ^tm tm$ tm表示出现在任意部分 # 元字符 ^ $ bmrw*b 匹配以字母mr开头的单词,先是从某个单词单词开始处(b),然后匹配字母mr,接着是任意数量的字母或数字(w*),最后是单词结束处(b) # 该正则表达式可以匹配“mrsoft”"mrbook""mr123456"
| 代码 | 说明 |
|---|---|
| . | 匹配换行字符以外的的任意字符 |
| w | 匹配字母或数字或下划线或汉字 |
| s | 匹配任意的空白符 |
| d | 匹配数字 |
| b | 匹配单词的开始或结束 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
# 限定符 (指定数字和字符) 匹配8位QQ号
^d{8}$
常用限定符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MOs6JpR-1648451110410)(E:笔记pythonimage-20211024233548191.png)]
3.字符类如果要匹配没有预定义元字符的字符集合(比如元音字母a,o,e,i,u):只需要在方括号里列出它们
[aeiou] #匹配任意一个元音字母 [.?!] #匹配标点符号. ? ! [0-9] #与d完全一样 代表一位数字 [a-z0-9A-Z] #完全等同于w(只考虑英文的话)
*说明:
[u4e00-u9fa5] #如果想要匹配给定字符串中的任意一个汉字,可以使用 [u4e00-u9fa5]+ #匹配连续多个汉字4排除字符
匹配不符合指定字符集合的字符串 ^放入[ ]
[^a-zA-Z] #匹配一个不是字母的字符5.选择字符
如何匹配身份证号?身份证号规则:身份证号码长度为15或18位;15位全部为数字;18位,前17位为数字最后一位为校验位,可能为数字或X 则需使用逻辑选择字符(| 或)来实现
(^d{15}$)|(^d{18})|(^d{17})(d|X|x)$
6.转义字符
与python一致,都是将特殊字符变为普通字符如("." “?” " "等)
例:127.0.0.1
[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} #匹配IPV4地址
7.分组
小括号()的作用:1.改变限定符的作用如 | * ^ 2.分组
(thir|four)th #匹配单词thirth或fourth
(.[0-9]{1,3}){3} #对分组(.[0-9]{1,3})进行重复操作
8.在python中使用正则表达式语法
在python中使用正则表达式时,是将其作为模式字符串使用
例1:匹配不是字母的一个字符的正则表达式表示为模板字符串
'[^a-zA-Z]'
例2:匹配以字母m开头的单词的正则表达式转换为模式字符串 *则不能在其两测添加引号定界符
需要将“ ”进行转义
'\bm\w*\b'
**由于模式字符串不能包含大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加r或R
r'bmw*b' #b表示字母的开始或结束二.使用re模块实现正则表达式操作
在python中提供了 re 模块用于实现正则表达式的操作
re提供的方法:search() match() findall() 还可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后使用该正则表达式对象的相关方法来操作字符串
#引入re模块 impotr re1.匹配字符串 (1)使用match() search() 方法进行匹配
用于从字符串的开始进行匹配,在起始位置匹配成功返回Match对象,否则返回None
语法格式:
re.match(pattern,string,[flags]) # pattern:模式字符串 # String:要匹配的字符串 # flags:标志位,可选参数
常用标志位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZ3HRilg-1648451110412)(E:笔记pythonIMG_20211025_153321.jpg)]
例1: # 搜索第一个以"mr_"开头的字符串,不区分大小写
pattern = r'mr_w+' string = 'MR_SHOP mr_shop' match = re.search(pattern, string, re.I) #re.I 不区分大小写 默认区分大小写 print(match) string = '项目名称 MR_SHOP mr_shop' match = re.search(pattern, string) print(match)
运行结果:
例2:# 验证是否出现危险字符
pattern = r'(黑客)|(抓包)|(监听)|(Trojan)'
about = '我是一名程序员,我喜欢看黑客方面的书,想研究一下Trojan'
match = re.search(pattern, about)
# match = re.match(pattern, about) match()方法在开始处匹配
print(match)
if match is None:
print(about, '@ 安全!')
else:
print(about, '@ 出现危险词汇!')
about = '我是一名程序员,我喜欢看计算机网络方面的书,喜欢开发网站'
match = re.match(pattern, about)
if match is None:
print(about, '@ 安全!')
else:
print(about, '@ 出现了危险词汇!')
运行结果
例3:# 使用Match对象的start(),end():获取匹配值的开始和结束位置 span():返回匹配位置的元组
pattern = r'mr_w+'
string = 'MR_SHOP mr_shop'
match = re.match(pattern, string, re.I)
print('匹配起始位置:', match.start())
print('匹配字符串的结束位置', match.end())
print('匹配位置的元组', match.span())
print('要匹配的字符串', match.string)
print('匹配数据', match.group())
# 邮箱匹配
regex = r"^[0-9a-zA-Z]+@[0-9a-zA-Z]+([0-9a-zA-Z]+.)*.[0-9a-zA-Z]{2,6}$"
string = '1410047264@qq.com'
match = re.search(regex, string)
print(match)
运行结果
匹配起始位置: 0 匹配字符串的结束位置 7 匹配位置的元组 (0, 7) 要匹配的字符串 MR_SHOP mr_shop 匹配数据 MR_SHOP
例4:# 验证输入的手机号是否合法
# 匹配手机号
pattern = r'(13[4-9]d{8})$|(15[01289]d{8})$'
mobile = '13690980328'
match = re.match(pattern, mobile)
if match is None:
print(mobile, '非法手机号')
else:
print('合法')
(2)使用findall()方法进行匹配
在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回,空则返回空列表
**语法格式:re.findall(pattern,string,[flags])
使用findall方法匹配此字符串
运行结果
['MR_SHOP','mr_shop']
['mr_shop']
例:匹配URL
pattern = r'([1-9]{1,3}(.[0-9]{1,3}){3})'
url = '127.0.0.1 192.168.1.66'
match = re.findall(pattern, url)
for item in match:
print(item[0])
127.0.0.1 192.168.1.66
2.替换字符串 (1)替换字符串 sub()方法 隐藏中奖信息的手机号码# 语法格式 re.sub(pattern,repl,string,count,flags)
# repl:表示替换的字符串
# count:表示模式匹配后替换的最大次数,默认为零
pattern = r'1[34578]d{9}'
string = '中奖号码为:84978981 联系电话: 13609580328'
result = re.sub(pattern, '136xxxxxxxx', string)
print(result)
3.分割字符串
(1)split()根据正则表达式分割字符串并以列表的形式返回
例1:
# 语法格式re.split(pattern,string,[maxsplit],[flags]) # maxsplit:表示最大的拆分次数 pattern = r'[?|&]' url = 'http://www.baiddu.com/login.jsp?username="mr"&pwd="mrsoft"' result = re.split(pattern, url) print(result)
运行结果:
['http://www.baiddu.com/login.jsp', 'username="mr"', 'pwd="mrsoft"']
例2:
str1 = '@尚奎 @用户名 @密码'
pattern = r's*@'
list1 = re.split(pattern, str1)
print("list1:")
for i in list1:
if i != "":
print(i)
list1: 尚奎 用户名 密码
attern, url)
print(result)
运行结果:
`['http://www.baiddu.com/login.jsp', 'username="mr"', 'pwd="mrsoft"']`
例2:
```python
str1 = '@尚奎 @用户名 @密码'
pattern = r's*@'
list1 = re.split(pattern, str1)
print("list1:")
for i in list1:
if i != "":
print(i)
list1: 尚奎 用户名 密码



