正则与re模块

正则表达式

前戏

案例:京东注册手机号校验

基本需求:手机号必须是11位、手机号必须以13 15 17 18 19开头、必须是纯数字
 
'''纯python代码实现'''
while True:
    # 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') or phone_num.startswith('19'):
                print('手机号码输入正确')
            else:
                print('手机号开头不对')
        else:
            print('手机号必须是纯数字')
    else:
        print('手机号必须是11位')
'''python结合正则实现'''
import re

phone_number = input('please input your phone number: ')
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
    print('是合法的手机号码')
else:
    print('不是合法的手机号码')

"""
正则表达式是一门独立的技术  所有编程语言都可以使用
它的作用可以简单的概括为:利用一些特殊符号(也可以直接写需要查找的具体字符)的组合产生一些特殊的含义然后去字符串中筛选出符合条件的数据
	>>>:筛选数据(匹配数据)
"""

字符组

'''字符组默认匹配方式是挨个挨个匹配'''
[0123456789]		匹配0到9任意一个数(全写)
[0-9]				匹配0到9任意一个数(缩写)
[a-z]				匹配26个小写英文字母
[A-Z]				匹配26个大写英文字母
[0-9a-zA-Z]			匹配数字或者小写字母或者大写字母
ps:字符组内所有的数据默认都是或的关系

特殊符号

'''特殊符号默认匹配方式是挨个挨个匹配'''
.			匹配除换行符以外的任意字符
\w			匹配数字、字母、下划线
\W			匹配非数字、非字母、非下划线
\s			匹配任意的空白符
\S			匹配非空白符
\d			匹配数字
\D			匹配非数字
\n			匹配一个换行符
\t			匹配一个制表符
\b			匹配一个单词的结尾
^			匹配字符串的开头
$			匹配字符串的结尾
		两者组合使用可以非常精确的限制匹配内容
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> 一条
#  .*属于典型的贪婪匹配 使用它 结束条件一般在左右明确指定
待使用正则(非贪婪匹配)
	<.*?>

转义符

'''斜杠与字母的组合有时候有特殊含义'''
\n			匹配的是换行符
\\n			匹配的是文本\n
\\\\n		匹配的是文本\\n
ps:如果在python中使用 还可以在字符串前面加r取消转义

正则表达式实战建议

1.编写校验用户身份证号的正则
		^[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})$
2.编写校验邮箱的正则
3.编写校验用户手机号的正则(座机、移动)
4.编写校验用户qq号的正则

'''很多时候 很多问题 要学会变通 前人已经弄好了 花点时间找一找就可以了'''

ps:能够写出简单的正则 能够大致看懂复杂的正则

re模块

在python中如果想要使用正则 可以考虑re模块

import re

# 常见操作方法

# findall
res = re.findall('a','abababa') # findall(正则表达式,待匹配的文本)
print(res) # ['a','a','a','a']结果符合条件的数据,组织成列表

# search
res = re.search('a','oboboba') # search(正则,待匹配文本)
print(res.group()) # a
res = re.search('a','obobob') # search(正则,待匹配文本)
print(res) # None 没有符合条件的数据返回None

# match
res = re.match('a','oabaonm') # match(正则表达式,待匹配的文本)
print(res) # None 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束了
res = re.match('a', 'aoabaonm') 
print(res.group())  # a  没有则无法调用group() 直接报错

# finditer
res = re.finditer('a','jhasgafadsda') # finditer(正则表达式,待匹配的文本)
print(res) # 结果是一个迭代器对象 为了节省空间
print([obj.group()for obj in res]) # ['a','a','a','a']

obj = re.compile('\d+') # 匹配数字
print(re.findall(obj,'shd123jmhf234eqwji342'))
# ['123','234','342']

re模块补充说明

1.分组优先
	 # 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.分组别名
    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
posted @ 2022-10-26 21:35  Super小赵  阅读(22)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************