正则表达式

正则表达式前言

# 京东注册页面获取手机号
	有很多校验规则
  	必须是11位的纯数字 并且必须是常规的手机号开头		(13,15,17,18,19)
那么上述的功能能否使用python代码实现?
# 1.获取手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.校验位数
if len(phone_num) == 11:
    # 3.校验是否是纯数字
    if phone_num.isdigit():
        # 4.校验开头是否合法
        if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
                '17') or phone_num.startswith('18'):
            print('输入正确')
        else:
            print('手机号开头不合法')
    else:
        print('手机号必须是纯数字')
else:
    print('手机号必须是11位')
    
#正则表达式就是利用目标数据或者一些特殊符号的组合取字符串中筛选出想要的数据  

# 使用正则表达式
import e 
phone_num = input('请输入手机号码:').strip
if re.match('^(13|14|15|18)[0-9]{9}$', phone_num):
	print('号码格式正确')
else:
    print('格式错误')
'''
正则表达式是一们独立的语言 专门用来匹配、校验、筛查数据,任何编程语言都能使用 在python中如果想使用就需要导入内置模块re
'''

正则表达式之字符组

单个字符组默认一次只匹配一个字符

[01234]      匹配09之间的任意一个数字
[0-9]		匹配09之间的任意一个数字
[a-z]		匹配a到z之间的任意一个小写字母
[A-Z]		匹配A到Z之间的任意一个小写字母
[0-9a-zA-Z]	 匹配任意一个数字或任意一个字母

正则表达式之特殊符号

.			匹配除换行符之外的任意字符
\w			匹配数字、字母、下划线
\d			匹配任意数字
\t			匹配制表符
^			匹配指定开头
$			匹配指定结尾
\W			匹配非字母数字下划线
\D			匹配非数字
a|b			匹配a或b
()			分组
[]			字符组,里面所有数据都是或的关系
[^]			除了指定字符

正则表达式之量词

'''量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数'''
# 量词默认都是贪婪匹配(尽可能多的匹配)
*			重复零次或者多次(默认多次)
+			重复一次或者多次 (默认多次)
?			重复零次或者一次(默认一次)
{n}			重复n次
{n,}		重复n次以上(默认多次)
{n,m}		重复n到m次,越多越好

# 练习
1. 李.?		李杰和李莲英和李二棍子	
>>>李杰 
>>>李莲 
>>>李二
2.李.+		李杰和李莲英和李二棍子	
>>>李杰和李莲英和李二棍子	
3.李.{1,3}
>>>李杰和李
>>>李二棍
4.李[杰莲英二棍子]*	李杰和李莲英和李二棍子	
>>>李杰 
>>>李莲英 
>>>李二棍子

复杂正则表达式编写

# 校验用户身份证号码
 身份证号码是一个长度为1518个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
# 校验邮箱 快递单号 座机号等比较常见的,可以百度查找
百度的前提是自己能够看懂别人写的大致意思
  	^[1-9]\d{13,16}[0-9x]$
    ^[1-9]\d{14}(\d{2}[0-9x])?$
    ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

取消转义

给每一个\都加上一个\来取消转移
\n ----> \\n
\\n ----> \\\\n

贪婪匹配与非贪婪匹配

<.*>		<script>alert(123)<script>       1条		贪婪匹配:
		以最后一个尖括号的出现作为结束标志
    
    
<.*?>   <script>alert(123)<script>			 2条 
	非贪婪匹配:
		以第一个尖括号的出现作为结束标志

量词默认都是贪婪匹配,如果向修改为非贪婪匹配 只需要在量词的后面加上?即可
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据

re模块

# 在python中无法直接使用正则表达式需要借助模块
1.内置re模块
2.第三方模块
import re
# findall('正则表达式',待匹配文本)
res = re.findall('a','jason aaa')
print(res)
['a','a','a','a']  结果是所有符合条件的数据,类型是列表

# search(正则表达式,待匹配的文本)
res1 = re.search('a', 'jason oscar aaa')
print(res1.group())
a   找到一个就结束 找不到返回None且调用group会报错

# match(正则表达式,待匹配的文本)
res2 = re.match('j', 'jason oscar aaa')
print(res2)  # None  从字符串的开头匹配 如果没有则返回None 如果符合也只获取一个就结束
print(res2.group())  # j  没有则无法调用group() 直接报错

#finditer(正则表达式,待匹配的文本)
res3 = re.finditer('a', 'jason oscar aaa'print(res3)  # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3])  # ['a', 'a', 'a', 'a', 'a']
                   
                   
# compile提前定义正则表达式
obj = re.compile('\d+')
print(re.findall(obj,'123gsdag1g55'))  # 写一遍之后 可以反复调用

作业

import re
with open(r'D:\py\work\info.txt','r',encoding='utf8') as f:
    data = f.read()
# res = re.findall('<h2>.*?</h2>',data)
# for i in res:
#     print(i[4:-5])
#
# res2 = re.findall('<p class="mapIco">.*?</p>',data)
# for j in res2:
#     print(j[18:-4])
#
# res3 = re.findall('"mailIco">.*?<',data)
# for n in res3:
#     print(n[10:-2])

res4 = re.findall('"telIco">.*?<',data)
for m in res4:
    print(m[9:-2])
posted @   名字只需六字  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示