常用模块之re模块

常用模块

image

正则表达式


"""
正则表达式是一门独立语言
   是通过一些特殊符号使用,从而在字符串中筛选出想要的结果
如果想在python中使用正则,则需借助于内置模块re
"""

字符组
[] : 包含一个字符或者的意思
[a-z] :a-z中任意取一个字符
[A-Z] :A-Z中任意取一个字符
[0-9] :0-9中任意取一个字符


特殊符号:
 # 特殊符号默认也只能单个单个字符匹配
. 		匹配除换行符以外的任意字符
\d		匹配数字
^		匹配字符串的开始
$		匹配字符串的结尾
		"""^与$组合使用可以精准的查找数据"""
a|b		匹配字符a或字符b
()		匹配括号内的表达式也表示一个组(不会影响正则表达式的匹配)
[...]	匹配字符组中的字符
[^...]	匹配除了字符组中字符的所有字符
\       在正则表达式中表示取消转义     # 在pyhon解释器中r' '表示转义


量词:
 *		 重复零次或多次
 +		 重复一次或多次
 ?		 重复零次或一次
{n}		 重复n次
{n,}	 重复n次或多次
{n,m}	 重复n到m次

贪婪匹配与非贪婪匹配
# 正则表达式
	<.*>  '''默认贪婪匹配 尽可能多的匹配'''
# 将贪婪变为非贪婪 只需要在量词的后面加问号即可
	<.*?> '''非贪婪匹配 尽可能少的匹  结束条件由左右两边决定'''

image

练习

# 限制手机号的输入
#  普通方法使用
phone = input('请输入您的手机号:').strip()
if len(phone) == 11:
    if phone.isdigit():
        if phone.startswith('15') or \
                phone.startswith('18') or \
                phone.startswith('19'):
            print('手机号正确')
        else:
            print('手机号不正确')
    else:
        print('手机号不正确')
else:
    print('手机号不正确')

#  正则方法使用
import re
phone_number = input('请输入您的手机号:').strip()
if re.match('^(15|18|19)[0-9]{9}$', phone_number):
    print('手机号正确')
else:
    print('手机号错误')

image

正餐

import re
常用用法:
    re.findall  # 匹配全部符合的数据后返回列表
    re.search   # 匹配到一个符合的数据  使用group获取结果
    re.match    # 从开头开始匹配 (开头必须对上) 使用group获取结果
    finditer    # 变成可迭代对象
    import re
    res = re.findall('.*', 'jason')
    res = re.findall('2.*1','aashdklah21h21')
    res = re.search('6', 'akdhisagfaifjweoaa0980a')
    res = re.match('sd', 'sdnospdghlds')
    print(res)  # 找不到则返回none
    print(res.group())  # 找不到则报错
其他用法:
	split   # 依次分割
	sub     # 替换
	subs    # 替换后组成元组后返回(并提示更换了几处)
    1.
    #  去除分割的字符 在[ab]中是分割a或b的字符  
    #  在'ab'中则分割以ab连着的字符
    res = re.split('[ab]', 'abdkashdlbsa')  
    # ['', '', 'dk', 'shdl', 's', '']
    res = re.split('ab', 'abdkashdlbsa')  
    # ['', 'dkashdlbsa']
    
    2.
    #  将字符替换成自己想替换的
    res = re.sub('a', 'A', 'akdbaaaa')
    #  AkdbAAAA
    
    3.
    # 将字符替换后并以元组的形式展示后 提示执行了几次
    res = re.subn('a', 'A', 'akdbaaaa')
    # ('AkdbAAAA', 5)
    

    # 集合使用
    regexp_obj = re.compile('\d+')
    res = regexp_obj.search('absd213j1hjj213jk')
    res1 = regexp_obj.match('123hhkj2h1j3123')
    res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
    print(res,res1,res2)
    
findall:
		1.针对分组优先
		2.取消优先级别  ?:
		
        
        # 无名分组 优先级
        res = re.findall
        ("^[1-9]\d{14}(\d{2}[0-9x])?$",'11018220000513162x')
        print(res)  # ['62x']
        
        # 取消优先级
       res = re.findall
       ("^[1-9]\d{14}(?:\d{2}[0-9x])?$",'11018220000513162x')
       print(res)  # ['11018220000513162x']
    
    search:   
          有名分组      ?P<名字>
            
    # 有名分组  按照索引取值,或关键字取值
	res = re.search("^[1-9](?P<x>\d{14})(?P<y>\d{2}[0-9x])?		$",'11018220000513162x')
    print(res.group())  # 11018220000513162x
    print(res.group(1))  # 10182200005131
    print(res.group(2))   # 62x
    print(res.group('x'))  # 10182200005131

image

posted @ 2021-11-24 17:16  代小白菜  阅读(91)  评论(0)    收藏  举报