【python】 正则表达式

一.python 正则表达式


1.元字符

# 行定位符"^"表示行的开始,"$"表示行的结尾 ^tm tm$  tm表示出现在任意部分

# 元字符 ^ $ \bmr\w*\b 匹配以字母mr开头的单词,先是从某个单词单词开始处(\b),然后匹配字母mr,接着是任意数量的字母或数字(\w*),最后是单词结束处(\b)

# 该正则表达式可以匹配“mrsoft”"mrbook""mr123456"
代码说明
.匹配换行字符以外的的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束

2.重复

# 限定符 (指定数字和字符) 匹配8位QQ号
^\d{8}$

常用限定符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MOs6JpR-1648451110410)(E:\笔记\python\image-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'\bm\w*\b'		#\b表示字母的开始或结束

二.使用re模块实现正则表达式操作


在python中提供了 re 模块用于实现正则表达式的操作

re提供的方法:search() match() findall() 还可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后使用该正则表达式对象的相关方法来操作字符串

#引入re模块
impotr re

1.匹配字符串

(1)使用match() search() 方法进行匹配

用于从字符串的开始进行匹配,在起始位置匹配成功返回Match对象,否则返回None

语法格式:

re.match(pattern,string,[flags])
# pattern:模式字符串
# String:要匹配的字符串
# flags:标志位,可选参数

常用标志位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZ3HRilg-1648451110412)(E:\笔记\python\IMG_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)

运行结果:

<re.Match object; span=(0, 7), match='MR_SHOP'> <re.Match object; span=(5, 12), match='MR_SHOP'>

例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, '@ 出现了危险词汇!')

运行结果

<re.Match object; span=(12, 14), match='黑客'> 我是一名程序员,我喜欢看黑客方面的书,想研究一下Trojan @ 出现危险词汇! 我是一名程序员,我喜欢看计算机网络方面的书,喜欢开发网站 @ 安全!

例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 <re.Match object; span=(0, 17), match='1410047264@qq.com'>

例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: 尚奎 用户名 密码

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data艺术家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值