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)
print('匹配值的起始位置:',match.start())
print('匹配值的结束位置:',match.end())
print('匹配值的元组:',match.span())
print('要匹配的字符串:',match.string)
print('匹配数据:',match.group())
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 :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写,常用标志表如下
import re
pattern = r'yxy_\w'
string = '希望Yxy_ddd'
search = re.search(pattern,string,re.I)
print(search)
pattern1 = r'(黑客)|(抓包)|(监听)|(Trojan)'
abot = '我是一名黑客,喜欢抓包,并且监听别人,想研究Trojan'
search1 = re.search(pattern1,abot)
print(search1)
- 方法三:使用findall()方法用于整个字符串中搜索所有符合正则表达式字符串,并以列表形式返回,如果匹配成功,返回包含匹配结构列表,否则返回空列表
语法:re.findall(pattern,string,[flags])
参数说明:
pattern:表示模式字符串,由要匹配正则表达式转换而来
string :表示要匹配的字符串
flags :可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写,常用标志表如下
import re
pattern = r'yxy_\w'
string = '希望Yxy_ddd yxy_ddd Yxy_ddd'
search = re.findall(pattern,string,re.I)
print(search)
2.2 替换字符串
语法: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']
'''