正则表达式与re模块
- 正则表达式前戏
- 正则表达式之字符值
- 正则表达式之特殊符号
- 正则表达式之量词
- 正则表达式之贪婪与非贪婪匹配
- 正则表达式之实战应用
- python正则模块之re
正则表达式前戏
案例:京东注册手机号校验
基本需求:手机号必须是11位,手机号必须以13,15,17,18,19开头,必须是纯数字
while True:
phone_num = input('请输入您的手机号').strip()
if len(phone_num) == 11:
if phone_num.isdigit():
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith('18') or phone_num.startswith('19'):
print('手机号输入正确')
else:
print('手机号开头不对')
else:
print('手机不是正确的数字')
else:
print('手机号必须是11位')
"""python结合正则实现"""
import re
phone_number = input('请输入您的手机号').strip()
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的结束,所有编程语言都可以使用
它的作用可以简单的概括为:利用一些特殊符号(也可以直接写需要查找的具体字符)
组合产生一些特殊的含义然后去字符串中筛选出符合条件的数据
>>>:筛选数据:匹配数据
"""
字符组
"""字符组默认匹配方式挨个挨个匹配"""
[012345679] 匹配0到9任意一个数(全写)
[1-9] 匹配0到9任意一个数(全写)
[a-z] 匹配26个小写英文字母
[A-Z] 匹配26个大写英文字母
[0-9a-zA-Z] 匹配数字或者小写字母或者大写字母
ps:字符组内所有的数据默认都是或的关系
特殊符号
"""特殊符号默认匹配方式是挨个挨个匹配"""
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
两者组合使用可以非常精确的限制匹配内容
a|b 匹配a或者b(管道符的意思是或)
() 给正则表达式分组,不影响表达式的匹配功能
[] 字符组 内部填写的内容默认都是或的关系
[^] 取反操作,匹配除了字符组里面的其他所有字符
注意上尖号在中括号内和中括号的意思完全不同
量词
"""正则表达式默认情况都是贪婪匹配>>>:尽可能多的匹配"""
* 匹配零次或多次 默认多次
+ 匹配一次或多次 默认多次
? 匹配零次或一次 默认一次
{n} 重复n次
{n,} 重复n次或更多次 默认多次
{n,m} 重复n到m次 默认m次
ps:量词必须结合表达式一起使用,不能单独出现,并且只影响左边第一个表达式
jason\d{3} 只影响\d
贪婪匹配与非贪婪匹配
"""所有的量词都是贪婪匹配如果想要变为非贪婪匹配只需要在量词后面加问号"""
待匹配的文本
<script>alert(123)</script>
待使用的正则(贪婪匹配)
<.*> '表示先匹配<然后点接收所有数据,重复无数次,直到最后一个>'
匹配的内容:
<script>alert(123)</script>
待使用的正则(非贪婪匹配):
<.*?>
匹配的内容:
<script></script>
转义符
"""斜杠与字母的组合有时候有特殊含义"""
\n 匹配的是换行符
\\n 匹配的是文本\n
\\\\n 匹配的是文本\\n
ps:如果是在python中使用 还可以在字符串前面加r取消转义
正则表达式实战建议
1.编写校验用户身份证号的正则
\d{17}[\d|x]|\d{15}
2.编写校验邮箱的正则
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
3.编写校验用户手机号的正则
0?(13|14|15|17|18|19)[0-9]{9}
4.编写校验用户qq号的正则
[1-9]([0-9]{5,11})
'https://tool.chinaz.com/regex/'
re模块
在python中如果想要使用正则 可以考虑re模块
import re
常见的操作方法
res = re.findall('a','jason apple eva')
print(res) # ['a', 'a', 'a'] 查找所有符合正则表达式要求的数据值,结果是一个列表的形式
res = re.finditer('a','jason apple eva')
print(res) # 查找所有符合正则表达式要求的数据值,结果是一个可迭代对象
res = re.search('a','jason apple eva')
print(res) # <re.Match object; span=(1, 2), match='a'>
print(res.group()) # 匹配到一个符合条件的数据值就结束
res = re.match('a','jason apple eva')
print(res) # None 匹配字符串的开头,如果不符合,后面就不用看了
obj = re.compile('\d{3}') # 当某一个正则表达式需要频繁的使用的时候,我们做成模板
res1 = obj.findall('1213254564')
res2 = obj.findall('sjhkl212532d')
print(res1, res2) # ['121', '325', '456'] ['212', '532']
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和‘bcd',再对‘’和‘bcd’分别按照‘b'切割
print(ret) # ['', '', 'cd']
ret = re.sub('\d','H','eva3jason4yuan4',1) # 将数字替换成'H',参数1表示只替换1个
print(ret)
ret = re.subn('\d','H','eva3jason4yuan4') # subn会返回元组,替换了多少次
print(ret) # ('evaHjasonHyuanH', 3)
re模块补充说明
1.分组优先
import re
res = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['oldboy']
findall分组优先展示:优先展示括号内正则表达式匹配到的内容
res = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['www.oldboy.com']
使用?:组合可以去掉分组优先展示
res = re.search('www.(baidu|oldboy).com','www.oldboy.com')
print(res.group()) # www.oldboy.com
res = re.match('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
2.分组别名
import re
res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
print(res.group('content')) # oldboy
print(res.group(0)) # www.oldboy.com
print(res.group(1)) # oldboy
print(res.group(2)) # .com
print(res.group('hei')) # .com

浙公网安备 33010602011771号