常用模块

正则表达式
"""
正则表达式是一门独立语言
是通过一些特殊符号使用,从而在字符串中筛选出想要的结果
如果想在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次
贪婪匹配与非贪婪匹配
# 正则表达式
<.*> '''默认贪婪匹配 尽可能多的匹配'''
# 将贪婪变为非贪婪 只需要在量词的后面加问号即可
<.*?> '''非贪婪匹配 尽可能少的匹 结束条件由左右两边决定'''

练习
# 限制手机号的输入
# 普通方法使用
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('手机号错误')

正餐
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
