正则表达式 re模块
今日内容概要
1.正则表达式前戏
2.正则表达式基本使用
3.正则表达式特殊符号
5.正则表达式贪婪与非贪婪匹配
6.正则表达式取消转义
7.python内置模块之re模块
今日内容详细
正则表达式前戏
# 京东注册页面获取手机号
有很多校验规则 必须是11位纯数字 并且必须是常规的手机号开头(13,15,17,18,19)
#上述的规则能否用python代码实现
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('17') \
or phone_num.startswith('18') \
or phone_num.startswith('19'):
print('是一个正确的11位手机号')
else:
print('手机号开头不合法')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')
# 使用正则表达式
"""正则表达式实现手机校验功能"""
import re
phone_num = input('please input your phone number:').strip()
if re.match('^(13|14|15|18)[0-9]{9}$',phone_num):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的语言 专门用来匹配,校验,筛查所需的数据
任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re
就是用一些'特殊符号'的组合去字符串中筛选出想要的数据"""
正则表达式之字符组
正则表达式在线测试网:
http://tool.chinaz.com/regex/
"""单个字符组默认一次只匹配一个字符"""
[0123456789] 匹配0到9之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字(简写)
[a-z] 匹配a到z之间的任意一个小写字母
[A-z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z] 匹配任意一个数字或者大小写字母(没有顺序)
正则表达式之特殊符号
"""前期就是死记硬背 使用频率高了之后自然就记住了"""
# 特殊符号默认也是一次匹配一个字符
. 匹配出换行符以外的任意字符
\w(小写) 匹配数字,字母,下划线(后续筛选变量名可能用到)
\d(小写) 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始
eg:^9 找9并且这个9必须在开头
$ 匹配字符串的结尾
eg:9$ 找9并且这个9必须在末尾
\W(大写) 匹配非数字或字母或下划线
\D 匹配非数字
a|b 匹配a或者b 符号|就是or(或者)的意思
() 给正则表达式分组 不影响正则匹配
[] 字符组的概念(里面所有的数据都是或者的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作
正则表达式之量词
"""
量词必须跟在表达式的后面 不能单独使用目的是增加匹配的字符数
"""
#注意量词默认都是贪婪匹配(尽可能多的匹配):后面详细的讲解
* 重复零次或者多次(默认就是多次:越多越好)
+ 重复一次或者多次(默认就是多次:越多越好)
? 重复零次或者一次(默认就是一次:越多越好)
{n} 重复n次
{n,} 重复最少n次最多多次(越多越好)
{n,m} 重复n到m次(越多越好)
复杂正则的编写
# 校验用户身份证号码
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或者x
^[1-9][0-9]{14}
^[1-9][0-9]{16}[0-9x]
"""
校验邮箱,快递单号,座机号...
很多常见的正则校验符号 不需要我们编写 直接百度查找即可
"""
ps:百度的前提是自己能够看懂别人写的大致意思
取消转义
\n \n false
\\n \n true
\\\\n \n true
在python中还可以在字符串的前面加r取消转义更加方便
贪婪匹配与非贪婪匹配
<.*> <scrip>alert(123)
<scrip> 1条 贪婪匹配
以最后一个大括号的出现作为结束标志
<.*?> <scrip>alert(123)<scrip>
2条 非贪婪匹配
以第一个大括号的出现作为结束标志
量词默认都是贪婪匹配 如果想修改为非贪婪匹配只需要在量词的后面加上?即可
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
re模块
# 在python中无法直接使用正则 需要借助于模块
1.内置的re模块
2.第三方的其他模块
import re
res = re.findall('a','jason oscar aaa') # findall(正则表达式,待匹配的文本)
print(res) # ['a', 'a', 'a', 'a', 'a'] 所有符合条件的数据 并且组织成了列表
res1 = re.search('a','jason oscar aaa')
print(res1) # <re.Match object; span=(1, 2), match='a'>
print(res1.group()) # a
res2 = re.match('j','jason oscar aaa')
print(res2) # <re.Match object; span=(0, 1), match='j'>
print(res2.group()) # j
res3 = re.finditer('a','jason oscar aaa')
print(res3) # <callable_iterator object at 0x000001CEAE3D9D90>
结果是一个迭代器对象 为了节省空间
print([i.group() for i in res3]) # ['a', 'a', 'a', 'a', 'a']
i = re.compile('\d+') # 提前写好后续需要经常使用的正则
print(re.findall(i,'fgbfj34jkttb5jk')) # ['34', '5']
print(re.findall(i,'jfbgkj489y64jhgt94i')) # ['489', '64', '94']
print(re.findall(i,'hgf854ytfu7h54utr')) # ['854', '7', '54']