正则表达式
import re
"""
正则表达式就是做字符串匹配的一种工具,很多语言都支持正则语法。正则语法是通用的
python中通过re模块提供的方法来使用正则
re.fullmatch(正则表达式,字符串) - 检查字符串是否完全匹配正则表达式的要求
如果不匹配结果是None,如果匹配结果是一个匹配对象
正则表达式 - 满足正则表达式的字符串 - r'正则表达式'
1.普通字符
普通字符在正则表达式中代表字符本身,例如 a, b, 1, 2....
"""
print('+++++++++++++++++普通字符++++++++++++++++++')
# 1.普通字符
re_data = r'hello' # 匹配hello字符串
resault = re.fullmatch(re_data, 'hello')
print(resault)
# 2.'.' - 匹配任意字符(换行符\n除外)
re_data1 = r'a.c' # 匹配3位字符串,第一位是a,第二位是任意字符,第三位是c
resault = re.fullmatch(re_data1, 'a+c')
print(resault)
# 3. \w - 匹配字母数字下划线 (还可以匹配中文日文等字符,不能匹配ASCILL码表中字母数字下划线除了不严谨一般不使用)
re_data2 = r'\w.' # 匹配2位字符串,第一位要求是字母数字下划线,后面是任意字符
resault = re.fullmatch(re_data2, 'のc')
print(resault)
# 4.\s - 匹配空白字符,一个\s只能匹配一个空白字符
re_data3 = r'...\s\s...' # 匹配一个8位的字符串,要求前三位和后三位是任意字符,中间两位必须的空白字符
resault = re.fullmatch(re_data3, ' ')
print(resault)
# 5.\d - 匹配一个数字字符
re_data4 = r'\d\dabc' # 匹配一个5位的字符串,要求前两位必须是数字,后三位是abc
resault = re.fullmatch(re_data4, '09abc')
print(resault)
# 6.\W - (匹配非数字字母下划线)
# 7.\S - (匹配非空白字符)
re_data5 = r'\Sabc' # 匹配一个4位的字符串,要求第一位是除开非空白字符外的任意字符,后三位是abc
resault = re.fullmatch(re_data5, ' abc')
print(resault)
# 8. \D - 匹配非数字字符
re_data7 = r'\Dabc' # 匹配一个4位的字符串,要求第一位是除开非数字字符外的任意字符,后三位是abc
resault = re.fullmatch(re_data7, ' abc')
print(resault)
# 9.[] - a.匹配字符集中的任何一个字符,一个[]只能匹配一个字符
# b.[字符1 - 字符2] - 匹配字符1到字符2中的任意一个字符(要求字符1的编码必须小于字符2)
re_data8 = r'[xyz]abc' # a.匹配一个4位的字符串,要求第一位是xyz中的任意字符,后三位是abc
resault = re.fullmatch(re_data8, 'xabc')
print(resault)
# [\da-zA-Z_] 匹配字母数字下划线
# [\u4e00-\u9fa5] 匹配所有中文
re_data9 = r'[2-8]abc' # b.匹配一个4位的字符串,要求第一位是2-8中的任意字符,后三位是abc
resault = re.fullmatch(re_data9, '7abc')
print(resault)
# 10. [^字符集] - 匹配不在字符集中的任意一个字符
re_data10 = r'[^\u4e00-\u9fa5]' # 匹配一个非中文字符
resault = re.fullmatch(re_data10, 'の')
print(resault)
print('++++++++++++检测字符的符号++++++++++++')
# 1. \b - 检测单词边界,检查\b所在的位置是否是单词边界
# 单词边界 - 字符串开头或结尾、空白、标点符号等
re_str = r'.abc\b' # 匹配一个长度是4的字符串,第一个是任意字符,后三位是abc;检测c的后面是否是单词边界
resault = re.fullmatch(re_str, '8abc')
print(resault)
re_str = r'how\b\sare' # 要求匹配how are两个字符串,how后面有个单词边界
resault = re.fullmatch(re_str, 'how are')
print(resault)
# 2.^检测是否是字符串开头
re_str = r'^abc'
resault = re.fullmatch(re_str, 'abc')
print(resault)
print(re.search(r'^\d\d', '92dkddka89dsd')) # 检测前两位是否数字开头
# 3.$ - 检测是否字符串结尾
re_str = r'abc$'
resault = re.fullmatch(re_str, 'abc')
print(resault)
print(re.search(r'\d\d$', 'dkddka89dsd83')) # 检测后两位是否数字结尾
print('++++++++++++++++++转义符号+++++++++++++++++')
# 字有特殊功能意义的符号前加‘\’,让这个正则符号变成普通符号
# 出了^放在[]开头,和-放在两个字符之间以外,其他单独的特殊符号,在[]没有特殊功能都是表示字符本身
re_str = r'\d\d\.\d\d' # 匹配一个5位字符串,前后两位是数字,中间是点
resault = re.fullmatch(re_str, '88.99')
print(resault)
# ^在[]中不是在开头就没有特殊意义,‘-’在[]只要不是在两个字符之间都表示‘-’本身
re_str = r'\d\d[-^]\d\d' # 匹配一个5位字符串,前后两位是数字,中间是或者-^
resault = re.fullmatch(re_str, '88^99')
print(resault)
print('++++++++++++++++匹配次数++++++++++++++++')
# 1. * - 匹配0次或者多次
"""
字符* - 字符出现0次或者多次
\d* - 数字出现0次或者多次
[a-z]* - 小写字母匹配0次或者多次
"""
re_str = r'a*' # 匹配一个字符串,a可以出现0次或者多次
resault = re.fullmatch(re_str, 'aaaaaaaaaa')
print(resault)
# 2. + - 匹配1次或者多次
re_str = r'a+' # 匹配一个字符串,a可以出现1次或者多次
resault = re.fullmatch(re_str, 'aaaaaaaaaa')
print(resault)
# 3.? - 匹配一个字符出现0次或者1次
# 练习写一个正则表达式,能够匹配一个整数
re_str = r'[-+]?\d+'
resault = re.fullmatch(re_str, '+555')
print(resault)
# 4.{}
"""
{n} - 匹配n次
{m,n} - 匹配最少m次,最多n次,m < n
{m,} - 至少m次
{,n} - 至少n次
"""
re_str = r'\d{4}'
resault = re.fullmatch(re_str, '5555')
print(resault)
# 练习,要求密码是否符号要求,密码要求由数字字母组成并且第一个字符是大写,长度6-12
# 符合要求提示可用,不符合提示不合格
# re_str = r'[A-Z][a-zA-Z\d]{5,11}'
# strs = input('请输入密码:')
# resault = re.fullmatch(re_str, strs)
# if resault:
# print('恭喜!密码符合要求')
# else:
# print('很遗憾!密码不符合要求')
# 5.贪婪,非贪婪
"""
贪婪 - 匹配次数不确定的时候尽可能多的匹配(上面次数不确定的符号都是贪婪的)
非贪婪 - 匹配次数不确定的时候尽可能少的匹配(上面次数不确定的符号后面加会变成非贪婪)
*? - 0次或者多次,尽可能少
+? - 1次或者多次,尽可能少
?? - 0次或者1次,尽可能少
{m,n}?
{m,}?
{,n}?
"""
re_str = r'a+'
resault = re.search(re_str, 'aaaa')
print(resault)
re_str = r'a+?'
resault = re.search(re_str, 'aaaa')
print(resault)
print('++++++++++++++++++分支和分组++++++++++++++++++++')
"""
匹配一个字符串,开头是abc或者xyz,后面是123 abc123 ,xyz123
1.正则1|正则2 - 先用正则1匹配,如果匹配失败再用正则2匹配,如果正则1和正则2中
只要有一个匹配成功就成功,两个失败才失败
注意:如果正则1匹配成功则不会使用正则2匹配
2.() - 分组,将部分正则作为一个整体
"""
re_str = r'(abc|xyz)\d{1,}' # 匹配一个至少4位字符串,前三位必须是abc或者xyz后面是数字
resault = re.fullmatch(re_str, 'abc5555')
print(resault)
# 3. \m - 重复前面第m个分组匹配到的内容
# 89ab89, 11abc11
re_str = r'(\d\d)ab\1' # 匹配一个开头和结尾是两位相同次数,中间是ab的字符串
resault = re.fullmatch(re_str, '45ab45')
print(resault)
# 联系,判断中国移动、电信、联通的电话号码
re_str1 = r'([1][358]\d\d{8})' # 移动
re_str2 = r'([1][3458][01256]\d{8})' # 联通
re_str3 = r'([1][358][0139]\d{8})' # 电信
num = '18200482453'
resault1 = re.fullmatch(re_str1, num)
resault2 = re.fullmatch(re_str2, num)
resault3 = re.fullmatch(re_str3, num)
if resault1:
print(num, '你输入的是移动号码')
elif resault2:
print(num, '你输入的是联通号码')
elif resault3:
print(num, '你输入的是电信号码')
else:
print('你输入的不是三大运营商的号码')
from re import *
"""
1.compile(正则表达式) - 创建正则表达式对象
re_str = r'\d{3}'
re_obj = compile(re_str)
2.fullmatch - 完全匹配--成功时返回匹配对象,不成功返回None
fullmatch(正则表达式,字符串) - 让正则和字符安全匹配,对整个字符串检查时使用
比如:判断账号密码,手机号,邮箱等
"""
print('++++++2+++++')
resault = fullmatch(r'\d{3}[a-z]{2}[A-Z]{3}', '232anAHS')
print(resault)
# 3.match(正则表达式, 字符串) - 让正则和字符串开头匹配,匹配失败返回None,成功返回对象
print('++++++3+++++')
resault = match(r'\d{3}', '232anAHS')
print(resault)
# 4.search - 字符串查找
# search(正则表达式,字符串)在字符串中找到第一个和正则表达式匹配的字串匹配失败返回None,成功返回对象
print('++++++4+++++')
resault = search(r'(\d{3})', 'dk789djsdn7654')
print(resault)
print(resault.span())
print(resault.start())
print(resault.end())
print(resault.group(1))
print(resault.string)
"""
通过匹配对象可以获取已下内容:
a.匹配结果
print(resault.group()) - 获取整个正则表达式匹配到的结果
print(resault.group(1)) - 获取第一个分组匹配到的结果
b.匹配范围 - 被匹配到的内容在远在圆字符串中的范围(开始,结束下标)
print(resault.span()) -- 开始和结尾
print(resault.start()) -- 开始下标
print(resault.end()) -- 结束下标
c.获取原字符串
print(resault.string)
"""
# 5.split - 字符串切割
# 将字符串按照满足正则表达式的字串进行切割
# 切割次数 - 不传参就全切
print('++++++++++++5+++++++++++')
print(split(r'\d+|[A-Z]+', 'jshbds786dsjAHD551'))
# 6.sub - 字符串替换
# sub(正则,替换字符串,原字符串) - 将原字符串中满足正则表达式的字串替换成新串
# 替换次数 - 不传参就全部替换
print(sub(r'\d+', '+', 'dde4de55555de8de9'))
# 7.findall - 查找所有
# findall(正则表达式, 字符串) - 在字符串中查找所有满足正则表达式的字串,以列表的形式返回
print(findall(r'\d+', 'dsjdk8995ddd4dss6dsd7ad2'))
# 有一个分组,只取分组匹配到的内容
print(findall(r'(\d+)d', 'dsjdk8995ddd4dss6dsd7ad2'))
# 有多个分组,只取分组匹配到的内容
print(findall(r'(\d+)([a-z]{2})', 'dsjdk8995ddd4dss6dsd7ad2'))
# 注意:使用findall的时候,如果有分组想要取得整个正则匹配的结果是取不到的
# 8.finditer - 查找所有
# finditer(正则表达式, 字符串) - 在字符串中查找所有满足正则表达式的字串,
# 返回一个迭代器,元素是每个字串对应的匹配对象
result = finditer(r'(\d[a-z]){3}\+', 'ahjs8a2a8j+胡士大夫9m2s0j+接收到sd8p+ss===')
print(result)
for x in result:
print(x.group(), x.group(1))
def get_name():
with open('data.txt', encoding='utf-8') as f:
content = f.read()
print(content)
re_str = r'"name":"(.+?)",'
result = findall(re_str, content)
# result = re.findall(r'\d\d','ashjf89kjskdf90naskhfk899nn,nmf67jkhh56hkhjk78')
print(result)
# get_name()