Day 15 正则表达式
Day 15 正则表达式
1.什么是正则表达式
正则表达式是让复杂的字符串处理变得更加简单的工具
2.正则语法
from re import fullmatch,search,findall
# 用之前先导入,从re模块中导入
fullmatch(正则表达式,字符串) —— 判断指定的字符串是否满足正则表达式描述的规则,如果不满足返回None
python中正则表达式是写到单引号或者双引号里面,例如:‘正则表达式’;js中正则表达式是放在两个/之间的,例如:/正则表达式/
1.匹配类符号
匹配类符号的特点是:一个符号必须匹配对应的字符
1)普通字符
普通字符指的是正则表达式中除了特殊符号以外的符号都是普通字符
普通字符在正则中表示这个符号本身
规则:一个字符串有三个字符,第一个字符是a,第二个字符是b, 第三个字符是c
re_str = 'abc'
result = fullmatch(re_str,'abc')
print(result)
2). ——匹配一个任意字符
规则:一个字符串有三个字符,第一个字符是a,中间字符是b, 最后一个字符是c
re_str = 'a.c'
result = fullmatch(re_str,'a哈c')
print(result)
3)\d ——匹配一个任意数字
规则:一个字符串有四个字符,第一个字符是a,最后一个字符是b,中间是两个任意数字
re_str = r'a\d\db'
result = fullmatch(re_str,'a12b')
print(result)
4)\s —— 匹配一个任意空白字符
空白字符:空格、\n(回车)、\t(缩进)
规则:一个字符串开头是两个数字,中间一个空白,然后再两个数字
re_str = r'\d\d\s\d\d'
result = fullmatch(re_str,'23 45')
print(result)
5)\D —— 匹配任意一个非数字字符(一般大写跟小写字母意义相反)
规则:一个字符串有四个字符,第一个字符不是数字,后面是abc
re_str = r'\Dabc'
result = fullmatch(re_str,'mabc')
print(result)
6)\S —— 匹配任意一个非空白字符
规则:一个字符串有五个字符,第一个字符是一个数字,第二个字符不是空白字符,后面是abc
re_str= r'\d\Sabc'
result = fullmatch(re_str,'2=abc')
print(result)
7)[字符集] —— 匹配字符集中任意一个字符
[abc你] - 能匹配'a'或者'b'或者'c'或者'你'
[abc\d]- 能匹配'a'或者'b'或者'c'或者任意数字
[1-9] - 匹配1到9中任意一个字符(根据数字编码值从前往后)
[a-z] - 匹配任意一个小写字母
[A-Z\d] - 匹配任意一个大写字母或者数字
[a-zA-Z] - 匹配任意一个字母
[\u4e00-\u9fa5] - 匹任意一个中文
注意:
1.一个[]只能匹配到一个字符
2.-如果在两个字符之间表示范围,这个-前面的字符的编码值必须小于-后面的的字符的编码值
3.-如果不在两个字符之间,表示-本身
re_str = r'a[2-8]b'
re_str = r'a2345678b'
练习:写一个正则表达式匹配一个字符串:123前面是一个数字,字母或者下划线
re_str = r'[1-9a-zA-Z_]123'
result = fullmatch(re_str, 'a123')
print(result)
8)匹配不在字符集中的任意一个字符
[^字符集]—— 匹配不在字符集中的任意一个字符
[^abc] — 匹配一个除了'a','b','c'以外的任意字符
[^a-zA-Z] - 匹配一个非字母字符
2.检测类符号
检测类符号:检测符号所在位置是否符合要求
注意:检测类的符号不影响匹配
1.\b - 检测是否是单词边界
单词边界:所有可以划分出两个不同单词的符号(空白、标点符号、字符串开头或者结尾)
re_str= r'mn\b,abc'
result = fullmatch(re_str,'mn,abc')
print(result)
2.\B - 检测是否是非单词边界
re_str = r'a.\Bb'
result = fullmatch(re_str, 'apb')
print(result)
3.^检测是否是字符串开头
re_str = r'^\d\d\d'
result = fullmatch(re_str, '627')
print(result)re_str = r'^\d\d\d'
result = search(re_str, 'sjhs是276鲨大富豪shj345')
print(result) # None
4.$ - 检测是否是字符串结尾
re_str = r'\d\d\d'
result = search(re_str, 'sjhs是276鲨大富豪shj345')
print(result) # '276're_str = r'\d\d\d$'
result = search(re_str, 'sjhs是276鲨大富豪shj345')
print(result) # '345'
3.匹配次数
1.*
- 匹配零次或多次
a* --- 匹配任意多个字符a
\d* ---匹配任意多个\d(任意多个任意数字字符)
re_str = r'a\d*b'
result = fullmatch(re_str,'a56577646b')
print(result)
re_str = r'a[num]*b'
result = fullmatch(re_str,'anunmub')
print(result)
2.+ —匹配一次或者多次(最少一次)
re_str = r'a[num]+b'
result = fullmatch(re_str,'anb')
print(result)
3.?—匹配0次或者1次
re_str = r'a[num]?b'
result = fullmatch(re_str,'anb')
print(result)
练习:写一个正则表达式能够匹配任意整数字符串,包括8879,+787,-67576
re_str = r'[+-]?[0-9]+'
result = fullmatch(re_str, '+7687')
print(result)
4.{}
{N} ------匹配N次
re_str = r'\d{3}'
result = fullmatch(re_str, '687')
print(result)
{M,N} -------匹配M到N次
{M,} -------匹配至少M次
{,N} -------匹配最多N次
5.贪婪和非贪婪(在匹配次数不确定时匹配模式分为贪婪和非贪婪)
贪婪:在能匹配成功的情况下尽可能多的去匹配,例如匹配1次,3次和4次都能匹配成功,最后取4次。
默认情况下,所有的不确定次数匹配都是贪婪的:*、+、?、{M,N}
非贪婪:在能匹配成功的情况下尽可能少的去匹配,例如匹配1次,3次和4次都能匹配成功,最后取1次。
在匹配次数不定的后面加?,就变成非贪婪模式*?、+?、??、{M,N}?
re_str = r'a.+b'
result = search(re_str,'呼呼呼ashaschb')
print(result) re_str = r'a.+?b'
result = search(re_str, '手机号ashb还是你b黄寺b大街')
print(result) # 'ashb're_str = r'a\d{2,5}?b'
result = search(re_str, '手机号a278b还是你b黄寺b大街')
print(result) # 'a278b'# 获取疫情信息国家名
with open('files/data.txt', 'r', encoding='utf-8') as f:content = f.read()
re_str = r'"provinceName":".+?"'
print(findall(re_str, content))
4.分支和分组
1.分组 - 用()将正则的一部分括起来看成一个整体进行操作
用法一:看成一个整体进行操作
re_str = r'\d{2}[a-z]{3}\d{2}[a-z]{3}\d{2}[a-z]{3}'
re_str = r'(\d{2}[a-z]{3})'
用法二:整体重复
在包含分组的正则中,可以通过\N来重复前面第N个分组匹配到内容
re_str = r'a(\d{2})=\1'
print(fullmatch(re_str,'a56=56'))
re_str = r'a(\d{2})=\1{2}'
print(fullmatch(re_str,'a56=5656'))
re_str = r'([a-z]+)=(\d{2,4})=\2\1'
print(fullmatch(re_str,'an=879=879an'))
用法三:捕获(只针对findall有效)
re_str = r'tel:(\d{5})' # 在tel后面相应的值上加()
print(findall(re_str,'tel:23768, name:xiaoming, age:18岁,id:27237486; tel:72891, name:张三, age:67岁, id:23479782')) # ['23768', '72891']
2.分支 —— |(相当于或者)
r'正则表达式1|正则表达式2' ---- 先用正则一进行匹配,如果失败再用正则2匹配
# abc234、abcKLH
# abc\d{3} 、abc[A-Z]{3}re_str = 'abc\d{3}|abc[A-Z]{3}' # abc234、abcKLH
print(fullmatch(re_str, 'abcMKL'))re_str = r'abc\d{3}|[A-Z]{3}' # abc234、KMN
print(fullmatch(re_str, 'KSM'))re_str = r'abc(\d{3}|[A-Z]{3})' # abc234、abcKLH
print(fullmatch(re_str, 'abc678'))
5.转义符号
正则的转义符号:在具有特殊功能或者特殊意义的符号前加,让符号原来的功能和意义消失,表示符号本身
re_str = r'abc\.'
print(fullmatch(re_str,'abc.'))re_str = r'\(\d{3}\)'
print(fullmatch(re_str, '(234)'))
具有特殊意义和功能的独立的符号,放在[]里面,对应的功能会自动消失,例如:+、?、*、$、^(不放在最前面)
re_str = r'abc[.\]+?*$^(]'
print(fullmatch(re_str, 'abc]'))
Day 15 正则表达式相关推荐
- Python系列15——正则表达式
目录 一.什么是正则表达式 二.正则表达式的要素与语法 1.普通字符 2.特殊字符 (1)非打印字符 (3)重复匹配符 3.正则表达式的逻辑与分组 4.正则表达式的函数 (1)findall (2)s ...
- python note 15 正则表达式
# 正则表达式 只和字符串打交道 # 正则表达式的规则 # 规则 字符串 从字符串中找到符合规则的内容 # 字符组 : [] 写在中括号中的内容,都出现在下面的某一个字符的位置上都是符合规则的 # [ ...
- Python学习15 正则表达式1
网址 正则表达式测试网址:https://regex101.com/ 概述 正则表达式: 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母) ...
- java生日正则表达式_Java编程基础15——正则表达式常用工具类
1_正则表达式的概述和简单使用 A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. 作用:比如注册邮箱,邮箱有用户名和密码,一般会 ...
- 15.正则表达式以及Data以及Calendar
1:正则表达式 (1)就是符合一定规则的字符串 (2)常见规则 A:字符 x 字符 x.举例:'a'表示字符a \\ 反 ...
- 非常经典的正则表达式
本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版权归原作者所有,欢迎转载.但是为了尊重原作者和译者的劳动,请注明出处!谢谢! 1. 什么是正则表达式 基本说来,正则表 ...
- 深入浅出之正则表达式(二)(转载)
前言: 本文是前一片文章<深入浅出之正则表达式(一)>的续篇,在本文中讲述了正则表达式中的组与向后引用,先前向后查看,条件测试,单词边界,选择符等表达式及例子,并分析了正则引 ...
- 使用正则表达式更改编译版本号
针对Visual Studio 6.0开发环境: 标准情况下在"[工程名].rc"文件中写入版本号:也允许使用每次编译自动加1宏在VersionNo.h中写入版本号.在新建项目时必 ...
- 深入浅出之正则表达式(二)
深入浅出之正则表达式(二) http://dragon.cnblogs.com/archive/2006/05/09/394923.html 前言: 本文是前一片文章<深入浅出之正 ...
最新文章
- MyBatis mapper代理方式
- java 泛型机制_java中的泛型机制
- oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解
- 强制 转换string 的一个简单方法(笔记)
- 粒度计算机英语,An Overview of Granular Computing粒度计算研究综述
- ogg oracle 测试kafka_云MSP技本功|基于OGG 实现Oracle到Kafka增量数据实时同步
- 【Tensorflow教程笔记】常用模块 tf.data :数据集的构建与预处理
- 禁忌搜索算法学习笔记
- pdf裁边app_PDF切边裁剪(paper for kindle)下载_PDF切边裁剪(paper for kindle)官方下载-太平洋下载中心...
- 左耳朵耗子:从“打工人”到技术创业者,我是如何作死的
- DEVC++实现街头篮球(爷青回)
- 《java程序设计基础》使用Reader和Writer流类
- MP3音频解码详细过程(二)
- shineblink BH1750光照强度传感器
- 微信小程序瀑布流的实现
- asf如何在linux运行,linux环境下使用mono运行asf挂卡
- 导航地图哪家强?谷歌地图超高分辨率完爆同类型对手
- uebs游戏_UEBS Ultimate Epic Battle电脑版
- 看完嵌入式培训视频的一些感受
- 从阿里安全峰会看它如何为安全奠基石