Python正则表达式

1.正则表达式基础

  • 处理字符串时,经常会有查找符合某些复杂规则字符串要求,正则表达式就是描述这些规则的工具

1.1 行定位符

  • 描述字符串边界,"^“表示开始;”$"表示结尾
^tm :匹配tm字母开头,例如tm equal可以匹配,而equal tm 不能匹配
tm$ :匹配tm字母结束,例如equal tm可以匹配,而tm equal 不能匹配
tm  :不加行定位符,tm equal与equal tm都可以匹配

1.2 元字符

  • 除元字符’’’^’‘和’’$’‘外,正则表达式很多元字符,如下案例应用元字符’’\b’‘和’’\w’’
\bmr\w*\b:匹配以字母mr开头单词,接着任意数量字母和数字\w*,最后单词\b结束
代码说明
.匹配除换行符意外的任意字符
\w匹配数字、字母、下划线或汉字
\W除数字、字母、下划线或汉字意外的字母
\s匹配单个的空白符(包括键和换行符)
\S除单个空白字符(包括键和换行符)以外的所有字符
\d匹配数字
\b匹配单词的开始或结束,单词的分界符通常是空格、标点符号或者换行
^匹配字符串的开始
$匹配字符串的结束

1.3 限定符

  • 使用(\w*)匹配任意量字母或数字,想匹配特定数量的数字,需要使用限定符(指定数量的字符)来实现,例如匹配8位QQ号可使用如下表达式
^\d{8}$
限定符说明举例
?匹配前面字符零次或一次colou?r,可以匹配colour和color
*匹配前面的字符零次或多次go*gle,可以匹配范围ggle 到 go…gle
+匹配前面的字符一次或多次go+gle,可以匹配范围从gogle 到 goo…gle
{n}匹配前面的字符n次go{2}gle,只匹配google
{n,}匹配前面的字符最少n次go{2,}gle,可以匹配范围从google 到goo…gle
{n,m}匹配前面的字符最少n次,最多m次数employe{0,2},可以匹配到employ、employe和employee三种情况

1.4 字符类

  • 正则表达式查找数字和字母很简单,已经有队形这些字符集合的元字符,如果想匹配没有预定元字符集合(原因字母a,e,i,o,u),需要在括号里列出即可
[aeiou]          : 匹配任意一个英文原因字母
[.?!]            : 匹配标点符(“.”,“?”或“!”)
[0-9]            : 代表含义与“\d”完全一致
[a-z0-9A-Z]      : 等同“\w”
[\u4e00-\u9fa5]  : 匹配给定字符串任意要给汉字
[\u4e00-\u9fa5]+ : 匹配连续多个汉字

1.5 排除字符

  • “^”表示行的开始,放到方括号中,表示排除意思
[^a-zA-Z] : 排除a-z和A-Z字符,匹配到不是一个字母的字符

1.6 选择字符

  • 身份证号码规则,长度15位或者18位置,如果为15位,全为数字;如果为18位时,则前面17位为数字,后面以为校验位,可能是数字或字符X,包含选择逻辑,需要选择字符(|)实现
^\d{15}$|^\d{18}$|(^\d{17})(\d|X|x)$ 
意思:匹配15位数字 or 18位置数字 or 17位数字最后一位可能是数字或者X或者是x

1.7 转移字符

  • 正则表达式转移字符()和Python大同小异,把特殊字符编程普通字符,如匹配IP地址127.0.0.1直接使用电字符格式为
  • 括号在表达式中算一个元字符
错误写法: [1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 

这样写显然不会,因为"."可以匹配任意字符,不仅127.0.0.1可以匹配,连127101011可以匹配
到,所以使用"." 时候需要使用转义字符如下

正确写法: [1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 

1.8 分组

  • 小括号第一个作用可以改变限定符的作用范围,如“|”“*”“^”等
  • 小括号第二个作用分组
作用一:(m|y)l 匹配单词ml或者yl,不使用小括号匹配m或者yl
作用二:(\.[0-9]{1,3}){3},对分组(\.[0-9]{1,3})进行重复3次操作

1.9 Python使用正则表达式语法

  • Python中使用正则表达式,将其作为模式字符串使用
'[^a-zA-z]'
  • 匹配字母o开头单词正则表达式转换为模式字符串,不能直接在其两侧添加引号定界符
错误写法:'\bm\w*\b'

正确写法:'\\bm\w*\b' 
原生字符:r'\bm\w*\b' (推荐使用)

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

  • Python提供re模块实现正则表达式操作,也可以使用re模块提供方法search()、match()、findall()进行字符串处理,可以使用complie()方法将模式字符串转化为正则表达式对象

2.1 匹配字符串

  • 方法一:使用match()方法从字符串开始处进行匹配,如起始位置匹配成功,返回Match对象否则返回None
语法:re.match(pattern,string,[flags])

参数说明:
pattern:表示模式字符串,由要匹配正则表达式转换而来
string :表示要匹配的字符串
flags  :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写,常用标志表如下
标志说明
A 或 ASCII对于\w、\W、\b、\B、\d、\D、\s和\S只进行ASCII匹配(只适用于Python 3.x)
I 或 IGNORECASE执行不区分字母大小写的匹配
M 或 MULTILINE匹配多行
S 或 DOTALL使用.匹配所有字符
X 或 VERBOSE忽略模式字符串中未转义的空格和注释
# 匹配字符串从开头进行匹配,不区分大小写
import re
pattern = r'yxy_\w+'                        # 模式字符串
string = 'YXY_ddddd yxy_ddddd'              # 要匹配的字符串
match = re.match(pattern,string,re.I)       # 匹配字符串,不区分大小写
print(match)                                # 输出:<re.Match object; span=(0, 9), match='YXY_ddddd'>

# Match对象包含匹配值的位置和匹配数据等信息
print('匹配值的起始位置:',match.start())    # 输出:匹配值的起始位置: 0
print('匹配值的结束位置:',match.end())      # 输出:匹配值的结束位置: 9
print('匹配值的元组:',match.span())        # 输出:匹配值的元组: (0, 9)
print('要匹配的字符串:',match.string)      # 输出:要匹配的字符串: YXY_ddddd yxy_ddddd
print('匹配数据:',match.group())          # 输出:匹配数据: YXY_ddddd

# 输入手机号码是否合法
import re
pattern = r'(13[4-9]\d{8})|(15[01289]\d{8})$'
mobile = input('请输入11位手机号码:')
match = re.match(pattern,mobile)
if match == None:
    print(mobile,'不是有效的中国移动手机号码')
else:
    print(mobile,'是有效的中国移动手机号码')
  • 方法二:使用search()方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,返回Match对象,否则返回None
语法:re.search(pattern,string,[flags])

参数说明:
pattern:表示模式字符串,由要匹配正则表达式转换而来
string :表示要匹配的字符串
flags  :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写,常用标志表如下
# search() 整个字符串搜索第一个匹配值 匹配成功不在匹配 返回Match对象 否则返回None
import re
pattern = r'yxy_\w'
string = '希望Yxy_ddd'
search = re.search(pattern,string,re.I)
print(search)                                # 输出<re.Match object; span=(2, 7), match='Yxy_d'>

# 验证危险字符
pattern1 = r'(黑客)|(抓包)|(监听)|(Trojan)'
abot = '我是一名黑客,喜欢抓包,并且监听别人,想研究Trojan'
search1 = re.search(pattern1,abot)
print(search1)                               # 输出:<re.Match object; span=(4, 6), match='黑客'>
  • 方法三:使用findall()方法用于整个字符串中搜索所有符合正则表达式字符串,并以列表形式返回,如果匹配成功,返回包含匹配结构列表,否则返回空列表
语法:re.findall(pattern,string,[flags])

参数说明:
pattern:表示模式字符串,由要匹配正则表达式转换而来
string :表示要匹配的字符串
flags  :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写,常用标志表如下
# findall()整个字符串搜索所有符合正则表达式字符串,列表形式返回
import re
pattern = r'yxy_\w'
string = '希望Yxy_ddd  yxy_ddd Yxy_ddd'
search = re.findall(pattern,string,re.I)
print(search)                                # 输出:['Yxy_d', 'yxy_d', 'Yxy_d']

2.2 替换字符串

  • sub()方法用于实现字符串替换
语法:re.sub(pattern,repl,string,count,flags)

参数说明:
pattern:表示模式字符串,由要匹配的正则表达式转换而来
repl   :表示替代的字符串
string :表示要被查找替换的原生字符串
count  :可选参数,表示模式匹配后替换的最大次数,默认值0,表示替换所有匹配
flags  :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写
# 验证替换危险字符
pattern1 = r'(黑客)|(抓包)|(监听)|(Trojan)'
abot = '我是一名黑客,喜欢抓包,并且监听别人,想研究Trojan'
search1 = re.sub(pattern1,'@_@',abot)
print(search1)                               # 输出:我是一名@_@,喜欢@_@,并且@_@别人,想研究@_@

2.3 使用正则表达式分隔字符串

  • split()方法用于实现根据正则表达式分隔字符串,并以列表形式返回,其作用与字符串对象的split()方法类似,所不同分割字符由模式字符串指定
语法:re.split(pattern,string,[maxsplit],[flags])

参数说明:
pattern :表示模式字符串,由要匹配的正则表达式转换而来
string  :表示要匹配的字符串
maxsplit:可选参数,表示最大拆分次数
flags  :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写
import re
pattern = r'[?|&]'
url = "http://www.ytrx.com.cn/login.jsp?username=yxy&pwd"
result = re.split(pattern,url)
print(result)                                           
'''
输出:['http://www.ytrx.com.cn/login.jsp', 'username=yxy', 'pwd']
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值