当前位置: 首页 > news >正文

正则表达式基础

正则表达式基础

一、初识正则表达式

思考–问题答案在文末

  • 问题1:text1 = ‘height:178,weight:168,sid:123456,passwd:9527’,如何快速找出密码?
  • 问题2:text2 = ‘他的电话是18812345678x,他的生日是20000908,他爱好的数字是01234567891,他的座机是:0571-52152166’,如何快速匹配座机?
  • 问题3:text3 = ‘1234567@qq.com’ ,如何检测邮箱格式是否正确?

Q1:什么是正则表达式?

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

Q2:他有什么用处?

  1. 判断给定的字符串是否符合正则表达式的过滤逻辑(验证):(验证:登录信息、手机号、邮箱地址)
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分(匹配)

常见匹配字符

符号描述
.匹配处换行符\n之外任意1个字符
[]匹配[]中任意一个
\d一个0-9数字
\D匹配非数字
\w匹配单词字符:a-z、A-Z、0-9
\W匹配非单词字符
\s匹配空格、tab健
\S匹配非空格,tab健

常用的匹配规则-匹配字符数量

  • 匹配前一个字符出现0次或者无数次

  • 匹配前一个字符出现1次或者无数次

符号描述
?匹配前一个字符出现0次或者1次
{m}匹配前一个字符出现m次
{m,}匹配前一个字符出现至少m次
{n,m}匹配前一个字符出现n-m次
^匹配字符串开头
$匹配字符串结尾
|
(ab)将括号中字符作为一个分组

二、 python正则表达式处理模块----re

2.1re.match函数----对字符串进行匹配

#re.match()函数,可以对字符进行匹配,查找的位置是从指定的位置开始一直往后找,返回第一个符合规则的对象,如果开始位置不符合匹配队形则返回None。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None。

import re
#基本的语法格式:match(pattern,string,flags=0)
#其中第一个参数是需要进行匹配的内容,第二个参数表示的是一个匹配的字符串,最后一个参数这是一个控制正则表达式的匹配方式,是一个可选的参数,
s1 = 'height:178 weight:168,sid:123456,passwd:9527'
re2 = re.match('[a-zA-Z]+\W\d+\s\w+',s1)
print(re2)s = "python is the bset language"
re1 = re.match('(.*)\s(\w+)\s(\w+)(\s\w+)(\s\w+)',s)
print(re1)
print(re1.group())
print(re1.group(1))
print(re1.group(2))
print(re1.group(3))
print(re1.span())*******************print*********************************
<re.Match object; span=(0, 17), match='height:178 weight'>
<re.Match object; span=(0, 27), match='python is the bset language'>
python is the bset language
python
is
the
(0, 27)

2.2 re.findall()

findall匹配所有返回一个列表,这个方法使用频率较高

import re
text = 'height:178,weight:168,sid:123456,passwd:9527'
print(re.findall(r'[a-zA-Z]+',text))
text2 = '12232443@qq.com'
print(re.findall(r'\d{6,10}@qq.com',text2))
text3 = 'syyang2022@163.com'
print(re.findall(r'\w+@\w+.\w{2,3}$',text3))
#print(re.findall(r'^[a-zA-Z-_]+@[a-zA-Z-_]+.[a-zA-Z-_]+',text3))
text4 = '10.10.10.10'
print(re.findall(r'\d{1,3}.\d+.\d+.\d+',text4))
#print(re.findall('\D+',text))*******************print*********************************
['height', 'weight', 'sid', 'passwd']
['12232443@qq.com']
['syyang2022@163.com']
['10.10.10.10']

2.3 re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。search 在全文中匹配一次,匹配到就返回 函数语法: re.search(pattern, string, flags=0) 示例: 输出结果: searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter

import re
s = "Cats are smarter than dogs"
re2 = re.search('are',s)
print(re2)
print(re2.group())*******************print*********************************
<re.Match object; span=(5, 8), match='are'>
are

2.4 re.sub()

检索和替换 re.sub()将匹配到的数据进行替换。 语法:re.sub(pattern, repl, string, count=0, flags=0) 示例: 输出结果: 电话号码是: 2019-0101-000 电话号码是 : 20190101000

import re
s = "python is the bset language"
re2 = re.sub('p','P',s,count=1)
print(re2)s = "2019-0101-000"
re2 = re.sub('-','',s,count=0)
print(re2)*******************print*********************************
Python is the bset language
20190101000

2.5 re.compile

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供其他函数使用,我们常用的正则表达式方法,都已经自带了compile了。 语法格式为: re.compile(pattern[, flags]) 示例: 输出结果: None <_sre.SRE_Match object; span=(3, 5), match=‘12’> 12

s1 = 'height:178,weight:168,sid:123456,passwd:9527'
pattern = "\d*"
re2 = re.match(pattern,s1)
print(re2)*******************print*********************************
<re.Match object; span=(0, 0), match=''>

2.6 re.split()

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下: re.split(pattern, string[, maxsplit=0, flags=0]) 示例: 输出结果: [‘www’, ‘huawei’, ‘com’]

import re
text = 'www.huawei.com'
print(re.split('w',text,))
print(re.split('\.',text))*******************print*********************************
['', '', '', '.hua', 'ei.com']
['www', 'huawei', 'com']

三、写正则表达式的步骤

我们仍然以包含分机号码的座机电话号码为例,比如0571-88776655-9527,演示下面的步骤:

  • 确定模式包含几个子模式

    它包含3个子模式:0571-88776655-9527。这3个子模式用固定字符连接。

  • 各个部分的字符分类是什么

    这3个子模式都是数字类型,可以用\d。现在可以写出模式为:\d-\d-\d

  • 各个子模式如何重复

    第1个子模式重复3到4次,因为有010和021等直辖市

    第2个子模式重复7到8次,有的地区只有7位电话号码

    第3个子模式重复3-4次

    加上次数限制后,模式成为:\d{3,4}-\d{7,8}-\d{3,4}

    但有的座机没有分机号,所以我们用或运算符让它支持两者:

    \d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}

  • 是否有外部位置限制

    没有

  • 是否有内部制约关系

    没有

经过一通分析,最后的正则就写成了,测试一下:

import re
text = '18812345678是他的手机号,他的身份证号是41188123456780978,他爱好的数字是01234567891,他的座机是:0571-52152166'
print(re.findall(r'^1\d{10}|\d{4}-\d{8}', text))*******************print*********************************
['18812345678', '0571-52152166']

掌握常见匹配符合及规则就够日常使用

四、4个问题答案

  • 问题1:text1 = ‘height:178,weight:168,sid:123456,passwd:9527’,如何快速找出4位数字密码?

    import re
    text1 = 'height:178,weight:168,sid:123456,passwd:9527'
    print(re.findall(r'\d{4}$',text1))*******************print*********************************
    ['9527']
    
  • 问题2:text2 = ‘他的电话是18812345678x,他的生日是20000908,他爱好的数字是01234567891,他的座机是:0571-52152166’,如何快速匹配座机?

    import re
    text2 = '他的电话是18812345678x,他的生日是20000908,他爱好的数字是01234567891,他的座机是:0571-52152166'print(re.findall(r'\d{4}-\d{8}',text2))*******************print*********************************
    ['0571-52152166']
    
  • 问题3:text3 = ‘1234567@qq.com’ ,如何检测qq邮箱格式是否正确?

    import re
    text3 = '1234567@qq.com' 
    print(re.findall(r'\d{6,10}@\w+.\w{2,3})',text3))*******************print*********************************
    ['1234567@qq.com']
    

日常笔记,共勉

http://www.lryc.cn/news/369134.html

相关文章:

  • 【Linux】进程间通信之命名管道
  • 【内存管理】页表映射
  • Cloudpods 强大的多云管理平台部署
  • 深度学习的可微渲染
  • CAS Server Restful接口实现后台认证
  • Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息
  • 【InternLM实战营第二期笔记】07:OpenCompass :是骡子是马,拉出来溜溜
  • matlab演示银河系转动动画
  • 备战 清华大学 上机编程考试-冲刺前50%,倒数第5天
  • leetCode127. 单词接龙
  • 进程概念(二)
  • java程序100道01—20
  • 让GNSSRTK不再难【第二天-第7部分2】
  • 计算引擎:Flink核心概念
  • 技术前沿 |【大模型InstructBLIP进行指令微调】
  • CSS-布局-flex
  • 「C系列」C 数组
  • Python框架scrapy有什么天赋异禀
  • 【ROS2大白话】四、ROS2非常简单的传参方式
  • 浅谈mysql 的批量delete 和 使用in条件批量删除问题
  • 【Spring Boot】过滤敏感词的两种实现
  • 在 Zustand 中管理状态能使用类(Class)吗
  • MoreTable 方法selectWithFun,count 使用实例
  • 【SpringBoot】在Spring中使用自定义条件类在Java声明Bean时实现条件注入
  • 网卡聚合链路配置
  • PlantSimulation导入cad图作为背景
  • 【大模型】个人对大模型选择的见解
  • java的反射和python的鸭子类型
  • 爬虫工具yt-dlp
  • 【代码随想录训练营】【Day 50】【动态规划-9】| Leetcode 198, 213, 337