正则表达式规则,正则表达式规则表
正则表达式是什么?该怎么用?
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
正则表达式应用——实例应用
验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;
2.验证电话号码:("^(\d{3,4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;
3.验证手机号码:"^1[3|4|5|7|8][0-9]{9}$";
4.验证身份证号(15位):"\d{14}[[0-9],0-9xX]",(18位):"\d{17}[[0-9],0-9xX]";
5.验证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$");
7.整数或者小数:^[0-9]+([.][0-9]+){0,1}$
8.只能输入数字:"^[0-9]*$"。
9.只能输入n位的数字:"^\d{n}$"。
10.只能输入至少n位的数字:"^\d{n,}$"。
JS正则表达式
一. 正则表达式
正则表达式:其实就是一种匹配规则,用于检索字符串
定义正则表达式的两种方式:1.直接定义 2.构造函数定义
那么正则表达式正则强大的地方是它可以写 通配符(拥有特殊含义的字符)
二.?通配符
\w 表示:字母、数字、下划线
\W 表示:除了字母、数字、下划线以外的字符
\d 表示:数字
\D 表示:非数字
^ 表示:以^符号后面的第一个字符开头
表示:以表示:以符号前面的第一个字符结尾
{n} 表示:重复n次
{n,m} 表示:重复n到m次
[xyz] 表示:其中任意一个字符
+ 表示:重复前一项1次或多次 等价于 {1,}
* 表示:重复前一项0次或多次 等价于 {0,}
? 表示:重复前一项0次或1次 等价于 {0,1}
. 表示:除了换行符以外的任意一个字符
\. 表示:.字符 ^ 表示:^ \表示:表示:
可以用()将多个字符作为一个整体
\w 等价于 [0-9a-zA-Z_]
| 表示:或者
[\u4E00-\u9FA5] 是常用汉字的unicode编码范围
三. 正则练习
四. 正则表达式配合字符串的方法
replace()方法
默认情况下,replace()方法,只会替换字符串中匹配的第一段内容
使用正则表达式,添加全局匹配修饰符g,可以替换匹配全部内容
使用正则表达式,添加忽略大小写修饰符i,在匹配内容时会忽略大小写
search()方法
可以通过正则表达式查找位置
五. 添加学生练习
!DOCTYPE html
html
head
? ? meta charset="UTF-8"
? ? meta http-equiv="X-UA-Compatible" content="IE=edge"
? ? meta name="viewport" content="width=device-width, initial-scale=1.0"
? ? title添加学生/title
? ? style
? ? ? ? .err{
? ? ? ? ? ? color: red;
? ? ? ? }
? ? ? ? .ok{
? ? ? ? ? ? color: green;
? ? ? ? }
? ? /style
/head
body
? ? form
? ? ? ? table
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td姓名:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input type="text" id="name"
? ? ? ? ? ? ? ? ? ? span id="nameMsg"/span
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td年龄:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input type="text" id="age"
? ? ? ? ? ? ? ? ? ? span id="ageMsg"/span
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td性别:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input checked name="sex" type="radio" value="0"男
? ? ? ? ? ? ? ? ? ? input name="sex" type="radio" value="1"女
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td爱好:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input name="hobby" type="checkbox" value="抽烟"抽烟
? ? ? ? ? ? ? ? ? ? input name="hobby" type="checkbox" value="喝酒"喝酒
? ? ? ? ? ? ? ? ? ? input name="hobby" type="checkbox" value="烫头"烫头
? ? ? ? ? ? ? ? ? ? input name="hobby" type="checkbox" value="睡觉"睡觉
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td年级:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? select id="grade"
? ? ? ? ? ? ? ? ? ? ? ? option value="0"请选择/option
? ? ? ? ? ? ? ? ? ? ? ? option value="1"大一/option
? ? ? ? ? ? ? ? ? ? ? ? option value="2"大二/option
? ? ? ? ? ? ? ? ? ? ? ? option value="3"大三/option
? ? ? ? ? ? ? ? ? ? ? ? option value="4"大四/option
? ? ? ? ? ? ? ? ? ? /select
? ? ? ? ? ? ? ? ? ? span id="gradeMsg"必须要选择一个年级/span
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td邮箱:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input type="text" id="email"
? ? ? ? ? ? ? ? ? ? span id="emailMsg"请输入正确的邮箱格式/span
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td电话:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input type="text" id="phone"
? ? ? ? ? ? ? ? ? ? span id="phoneMsg"请输入正确的电话格式/span
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td生日:/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? input type="text" id="bornDate"
? ? ? ? ? ? ? ? ? ? span id="bornDateMsg"请输入正确日期格式/span
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? ? ? tr
? ? ? ? ? ? ? ? td/td
? ? ? ? ? ? ? ? td
? ? ? ? ? ? ? ? ? ? button type="submit"提交/button
? ? ? ? ? ? ? ? ? ? button type="reset"重置/button
? ? ? ? ? ? ? ? /td
? ? ? ? ? ? /tr
? ? ? ? /table
? ? /form
? ? script
? ? ? ? //获取姓名文本框
? ? ? ? let name = document.querySelector('#name')
? ? ? ? //获取年龄文本框
? ? ? ? let age = document.querySelector('#age')
? ? ? ? //表单的提交事件
? ? ? ? document.querySelector('form').onsubmit = function(){
? ? ? ? ? ? // 返回true提交表单,返回false不提交表单
? ? ? ? ? ? if(checkName() checkAge()){
? ? ? ? ? ? ? ? return true
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? return false
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //姓名文本框失去焦点
? ? ? ? name.onblur = checkName
? ? ? ? //验证姓名
? ? ? ? function checkName(){
? ? ? ? ? ? //定义验证姓名的正则
? ? ? ? ? ? let reg = /^[\u4E00-\u9FA5]{2,4}$/
? ? ? ? ? ? // 调用验证方法
? ? ? ? ? ? return checkInput("#nameMsg",name,reg,'姓名正确','姓名必须是2-4位汉字')
? ? ? ? }
? ? ? ? //年龄文本框失去焦点
? ? ? ? age.onblur = checkAge
? ? ? ? //验证年龄
? ? ? ? function checkAge(){
? ? ? ? ? ? //定义验证年龄的正则
? ? ? ? ? ? let reg = /^\d{1,2}$|^1([0-1]\d)|20$/
? ? ? ? ? ? // 调用验证方法
? ? ? ? ? ? return checkInput("#ageMsg",age,reg,'年龄正确','年龄必须是0-120之间')
? ? ? ? }
? ? ? ? //验证方法,参数分别是:span元素Id,表单元素对象,正则规则,验证成功消息,验证失败消息
? ? ? ? function checkInput(spanId,_this,reg,okMsg,errMsg){
? ? ? ? ? ? // 获取消息span
? ? ? ? ? ? let span = document.querySelector(spanId)
? ? ? ? ? ? //获取信息
? ? ? ? ? ? let val = _this.value
? ? ? ? ? ? if(!reg.test(val)){
? ? ? ? ? ? ? ? span.className="err"
? ? ? ? ? ? ? ? span.innerHTML = errMsg
? ? ? ? ? ? ? ? return false ?//验证失败返回false
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? span.className="ok"
? ? ? ? ? ? ? ? span.innerHTML = okMsg
? ? ? ? ? ? ? ? return true ?//验证成功返回true
? ? ? ? ? ? }
? ? ? ? }
? ? /script
/body
/html
正则表达式基本知识
完整的正则表达式由两种字符构成:
通俗理解: 根据语言的规则,按照语法把单词组合起来,就会得到能传达思想的文本。
思维架构: 完整的正则表达式由小的构建模块单元组成。
Example One:
Example Two:
Example Three:
应用场景: 我们需要搜索的单词是 "grey" ,同时又不确定是否写作 "gray" ,就可以使用 正则表达式结构体[...] ( gr[ea]y )。它容许使用者列出某处期望匹配的字符,通常被称作 字符组 。
- : 连字符表示一个范围: H[123456] 等同于 H[1-6]
注意:
作用: [^ ... ] 替代 [...] , 这个字符组就会 匹配一个未列出的字符 。字符组中开头的 ^ 表示 "排除"
注意: 排除元字符必须紧挨在 [ 之后,连接元字符 - 紧挨在排除元字符 ^ 之后也算作连接元字符
作用: 元字符 . 是用来匹配任意字符的字符组的简便写法
概念: | 是一个简捷的元字符,它的意思是 或 ,能够把不同的子表达式组合成一个总的表达式,而这个总的表达式又能够匹配任意的子表达式。
注意: | 配合 () 可以限制代表子表达式的界限
Example:
元字符 ? 代表可选项。它只作用于之前紧邻的元素 (单个元素 或 使用 () 限制起来的元素) ,出现的次数为 0 或 1
Example:
应用基础: 在正则表达式中, () 能够 "记住" 它们包含的子表达式匹配的文本。
应用场景: 穷举所有可能出现的重复单词显然是不可能完成的任务。
反向引用概念: 反向引用是正则表达式的特性之一,它容许我们匹配与表达式先前部分匹配的同样的文本
反向引用需要与()配合: () 能够记忆其中的子表达式匹配的文本,不论这些文本是什么,元字符序列 \1 都能记住它们。在一个表达式中可以使用多个括号。再用 \1 、 \2 、 \3 等来表示第一、第二、第三组括号匹配的文本。
Example:
应用场景: 如果需要匹配的某个字符本身就是元字符,则需要使用转义符号 \ 。
正则表达式匹配规则
本文介绍的并不是正则表达式的通配符含义,或者一些正则的书写技巧
而是介绍正则匹配的流程,正则进行匹配的规则
例如字符串:abcde
这个时候位置关系如下
分为两种
①是普通匹配,普通匹配占宽度,匹配的是字符
②是断言,断言不占宽度,匹配的是某一个位置,所以断言也被叫做零宽度断言。
例如表达式:/\w(?=\d)/
首先表达式拆解为 \w 与 (?=\d) 两个部分,
表达式 \w 匹配一个字符,占用一个宽度,(?=\d) 表示一个数字的位置
整个正则表达式连接起来就是,首先匹配一个字母或者数字 \w,匹配的这个 \w 后面必须紧跟一个数字 (?=\d)
这里的 \w 为普通匹配,占用宽度,而 (?=\d) 为断言,并不占用宽度,只是规定 \w 后面必须含有一个数字
看一下使用上面这个表达书进行匹配的结果
断言由于不占宽度所以match的结果只有字符'c'
联系第 1 点和第 2 点
例如我们有一个正则表达式,和一个需要进行匹配的字符串
首先对字符串位置做标记,方便我们观察
同样的,我们对正则表达式 /bc/g 进行拆解为 b 与 c 两部分
匹配的过程如下:
①当正则匹配不成功的时候,就会尝试进行回溯
②回溯成功与否取决于是否有可回溯的位置
③若没有会回溯位置,则整个正则表达式匹配失败,控制权交还给表达式的起始位置
④正则规则中使用量词修饰,或者使用|的时候,所匹配的位置为可回溯位置
依旧是一个简单的例子
依旧对正则进行拆解,拆解成 a,b{1,3},b,b,c 五部分
依旧按照之前的规则进行匹配
①正则匹配规则 a, b{1,3}, b, b, c 分别匹配到了字符 a, b, b, b, c
②整个过程中由于 b{1,3} 存在可回溯位置,正则默认匹配规则为贪婪模式,b{1,3} 首先尽可能多的匹配,直到无法继续匹配的时候将控制权移交给下一个匹配字符
③当之后的匹配字符匹配失败的时候,正则表达式尝试从可回溯位置开始进行匹配,如果匹配依旧失败的话,再往前找上一个可回溯位置,直到表达式匹配成功
④如果已经没有任何可回溯位置能满足表达式,则整个表达式匹配失败,它将从上次匹配字符串的开始位置的下一个位置再次尝试匹配
正则默认为贪婪模式,
贪婪模式为尽可能多的匹配,但是非贪婪莫模式不能只解释为尽可能少的匹配
这个时候确实可以理解为尽可能少的匹配
再看一个例子
这个时候如果按照尽可能少的匹配的原则,匹配到的应该是['d1']
所以不能单纯的理解为尽可能少的匹配
表达式拆解为 [a-z]{1,5} 与 1 两部分
正则表达式
main role="main" class="App-main" style="padding-bottom: 46px;"
首发于 Python办公自动化
无障碍 写文章
登录
article class="Post-Main Post-NormalMain" tabindex="-1" style="box-sizing: border-box; outline: none;"
header class="Post-Header" style="margin: 0px auto; width: 690px;"
第一小乔乔
进一步,是一步。一起工作进步,厨艺精进,生活美满。
22 人赞同了该文章
/header
[图片上传失败...(image-f7fc00-1650193970962)]
match()和search()都只匹配出一个符合条件的字符串,若想要所有,可以使用re.findall()
# 用[]{}判断密码是否符合要求 :密码是由数字和字母组成,并且位数是6-16位
##用split按-或者空白格分割字段
结果:['ahsb1sssa8', 'jjhd7nhs', '90nsjhf3', '4hh', 'h7', '8kjj', 'sfav']
#用sub替换符合条件的关键词, 试试马赛克脏话(想起农药不能痛骂队友的愤怒)
##练练转义
## findall返回符合表达式的子串
一、正则表达式语法
正则表达式是用匹配或者描述字符串的工具。
用处:
a.判断字符串是否满足某个条件---判断输入的字符串是否是邮箱/手机号码。是否是ip地址
b.提取满足条件的字符串
c.字符串替换
Python中通过re模块中相应的方法来支持正则表达式的匹配、查找和替换等功能
fullmatch(正则表达式字符串, 字符串) --- 判断正则表达式和字符串是否完全匹配
正则表达式字符串: 就是一个字符串,字符串中是正则表达式语法。r'正则表达式'
正则表达式中包含两个部分,一个是正则语法对应的字符,二个是普通字符
1 .(点)(匹配任意字符)
一个.只匹配一个任意字符
2 \w(匹配字母数字下划线)
一个\w匹配一个字符
3 \s(匹配任意空白字符)
空白字符: 空格、制表符(\t)、回车(换行\n)等,都输入空白字符
一个\s匹配一个空白字符
4 \d(匹配数字字符)
一个\b不会去匹配一个字符,而是单纯的检测\b出现的位置是否是单词边界
单词边界: 字符串开始和结尾、空格、换行、标点符号等,可以将两个单词隔开的字符都单词边界
6 ^(检测是否是字符串开头)
re_str = r'^\d\d\d' # 判断一个字符串是否是三个数字开头
7 $(检测是否是字符串结尾)
8 \W(匹配非字母、数字下划线)
9 \S(匹配非空白字符)
10 \D(匹配非数字字符)
11 \B(检测是否不是单词边界)
12 [] (匹配中括号中出现的任意一个字符)
一个[]匹配一个字符
[字符集] -- 匹配一个字符,这字符是字符集中的任意一个字符
例如:[abc], [\d+]
[字符1-字符2] -- 匹配一个字符,这个字符是Unicode编码值在字符1到字符2中的任意一个字符;要求字符1的编码值要小于字符2
例如:[1-9] -- 数字1到9 [a-z] -- 小写字母 [A-Z] -- 大写字母
[\u0031-\u0039] -- 数字1到9
[\u4E00-\u9fa5] -- 匹配所有的汉字
注意:-在中括号中,如果放在两个字符之间表示范围。
13 [^字符集] (匹配一个不在字符集中的任意字符)
注意:^必须放在中括号中的最前面才有效
二、正则表达式次数相关符号
from re import fullmatch
1. *(匹配0次或者多次)
字符* -- 字符出现0次或者多次
2. +(匹配一次或者多次)
3. ?(匹配0次或者1一次)
练习:写一个正则表达式,匹配所有的整数(123, -2334, +9...可以匹配的,012, -023,+0122不能匹配)
{N} -- 匹配N次
{M,N} -- 匹配M到N次
{M,} -- 至少匹配M次
{,N} -- 最多匹配N次
三、分之和分组
import re
1. |(分之)
条件1|条件2 -- 先用条件1去匹配,如果匹配成功就匹配成功。如果条件1匹配失败,用条件2去匹配。
注意:如果条件1匹配成功就不会用条件2再去匹配
能匹配成功时abc,d和aaa
'abc'+W/H/Y
2. ()(分组)
a.组合(将括号中的内容作为一个整体进行操作)
b.捕获 -- 使用带括号的正则表达式匹配成功后,只获取括号中的内容
c.重复 -- 在正则表达式中可以通过\数字来重复前面()中匹配到的结果。数字代表前第几个分组
a.组合
匹配一个字符串,以数字字母的组合出现3次
b.捕获
c.重复
3.转义符号
正则表达式中可以通过在特殊的符号前加\,来让特殊的符号没有意义
. -- 任意字符 . -- 字符.
注意:在中括号有特殊功能的符号,只代表符号本身
\不管在哪儿都需要转义
-在[]外面没有特殊功能,在[]中要表示-本身,就不要放在两个字符之间
()需要转义
四、re模块中的函数
import re
1. compile
compile(正则表达式字符串) -- 将正则表达式字符串转换成正则表达式对象
2. fullmatch和match
fullmatch(正则表达式字符串, 字符串)
-- 用正则表达式去完全匹配字符串(匹配整个字符串),返回匹配对象(SRE_Match)或者None
match(正则表达式字符串, 字符串)
-- 匹配字符串开头,返回匹配对象或者None
1.span(group=0) -- 获取匹配成功的区间(左闭右开区间)
print(result.span(0))
print(result.start(1)) # 获取匹配到的开始下标
print(result.end(1)) # 获取匹配到的结束下标后的下标
2.group(group = 0) -- 获取匹配结果
group()/group(0) -- 获取正则表达式完全匹配的结果
group(index0) -- 获取正则表达式中第group个分组匹配到的结果
3.string -- 获取被匹配的原字符串
3.search
search(正则表达式, 字符串)
-- 查找字符串中满足正则表达式的第一个字符串。返回值是匹配对象或者None
练习:使用search匹配出一个字符串中所有的数字字符串'abc34jshd8923jkshd9lkkk890k' -- 34,8923,9,890
4.findall
findall(正则表达式, 字符串) -- 获取字符串中满足正则表达式的所有的子串,返回一个列表
注意:如果正在表达式中有分组,取值的时候只取分组中匹配到的结果;
如果有多个分组,会将每个分组匹配到的结果作为一个元祖的元素
5.finditer
finditer(正则表达式, 字符串)
-- 查找所有满足正则条件的子串,返回值是迭代器,迭代器中的元素是匹配对象
6. split
split(正则表达式,字符串) -- 将字符串按照满足正则表达式条件的子串进行分割
"""
str1 = 'ahsb1sssa8-jjhd7nhs+90nsjhf3-4hhh7+8kjj-'
result = re.split(r'[-+]', str1)
print(result)
7.sub
sub(正则表达式,repl,字符串) -- 将字符串中满足正则表达式条件的子串替换成repl。返回替换后的字符串
作业
1. 写一个正则表达式判断一个字符串是否是ip地址
规则:一个ip地址由4个数字组成,每个数字之间用.连接。每个数字的大小是0-255 例如:255.189.10.37 正确 256.189.89.9 错误
2. 计算一个字符串中所有的数字的和
例如:字符串是:‘hello90abc 78sjh12.5’ 结果是90+78+12.5 = 180.5
3. 验证输入的内容只能是汉字
4. 电话号码的验证
二、不定项选择题
编辑于 2020-12-21 17:02
Python
正则表达式
赞同 22
3 条评论
分享
/article
[图片上传失败...(image-b1d3-1650193970960)]
懒人必备
[[图片上传失败...(image-645a0f-1650193970961)]
裸睡的猪发表于猪哥的Py...]( )
[# 【Python】正则表达式基础知识
正则表达式(regular expression)是一种处理字符串的工具,功能十分强大。正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理,可以快速,准确地完成复杂…
长弓瑾瑜]( )
[[图片上传失败...(image-c617e9-1650193970961)]
123456]( )
[# Python之正则表达式入门
前言:此文实际上是本人在慕课学习北京理工大学课程:Python网络爬虫与信息提取 一课所做的一部分笔记,是作为初学者的入门笔记,自然有许多遗漏或者疏忽,欢迎大家指出。一、正则表达式基…
热水]( )
切换为时间排序
写下你的评论...
label class="UploadPicture-wrapper" style="cursor: pointer;"/label
发布
/main
label class="Editable-languageSuggestionsInput Input-wrapper" style="position: relative; display: flex; -webkit-box-align: center; align-items: center; width: 180px; height: 34px; padding: 4px 10px; font-size: 14px; background: rgb(255, 255, 255); border: 1px solid rgb(235, 235, 235); border-radius: 3px; box-sizing: border-box; transition: background 0.2s ease 0s, border 0.2s ease 0s; cursor: pointer;"input autocomplete="off" role="combobox" aria-expanded="false" aria-autocomplete="list" aria-activedescendant="AutoComplete17-0" id="Popover16-toggle" aria-haspopup="true" aria-owns="Popover16-content" class="Input" placeholder="选择语言" value="" style="-webkit-box-flex: 1; flex: 1 1 0%; padding: 0px; overflow: hidden; font-family: inherit; font-size: inherit; font-weight: inherit; background: transparent; border: none; resize: none; color: rgb(18, 18, 18); height: 24px; line-height: 24px; cursor: inherit;"/label