首页 > 其他分享 >2021-4-30-正则表达式总结

2021-4-30-正则表达式总结

时间:2024-03-22 17:24:08浏览次数:28  
标签:匹配 22 正则表达式 55 30 重复 2021 pattern

元字符、反义、转义、贪婪与懒惰、分组、后向引用、零宽断言、Python中的re模块

参考文档

https://deerchao.cn/tutorials/regex/regex.htm

元字符

元字符 说明
. 匹配除换行符以外的其他任意字符
\w 匹配字母、数字、下划线、汉字
\s 匹配任意空白字符
\d 匹配任意数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

反义

语法 说明
\W 匹配任意不是字母、数组、下划线、汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结尾的位置
[^x] 匹配除x以外的任意字符
[^aeiou] 匹配除aeiou以外的任意字符

转义

想要匹配 . ? *这样的字符,需要进行转义,使用\ ,如 \. \? \*

重复模式

语法 说明
* 重复0次或更多次
+ 重复一次或更多次
? 重复零次或一次
重复n次
重复n次或更多次
重复n次到m次

贪婪与懒惰

语法 说明
*? 重复任意次,但尽可能少的重复
+? 重复1次或更多次,但尽可能少的重复
?? 重复0次或1次,但尽可能少的重复
{n,m}? 重复n到m次,但尽可能少的重复
{n,}? 重复n次以上,但尽可能少的重复

分组

使用()来指定要重复的子表达式,然后对这个表达式进行重复,如 (abc)?表示0个或1个abc。分组可分为捕获分组、不捕获分组、命名分组。

1)捕获分组

表达式(A)(B(C)) 中,存在四个这样的组:

0 (A)(B(C))
1 (A)
2 (B(C))
3 (C)

0始终代表整个表达式

2)不捕获分组

以 (?) 开头的组是纯的非捕获组,(?:Pattern),它的作用就是匹配Pattern字符,好处就是不捕获文本,不将匹配到的字符存储到内存中,从而节省内存

例: 匹配indestry或者indestries

我们可以使用indestr(y|ies)或者indestr(?:y|ies)

例: (?:a|A)123(?:b)可以匹配a123b或者A123b

3)命名分组

语法: (?)

js中

"http://www.baidu.com".match(/(?<protocol>\w+):\/\/(?<domain>\w+\.\w+\.\w+)/);

// 返回结果
0: "http://www.baidu.com"
1: "http"
2: "www.baidu.com"
groups:
    domain: "www.baidu.com"
    protocol: "http"

PHP

// pattern中, protocol采用了 (?<name>)方式, domain采用了 (?P<name>)方式
$pattern = "/(?<protocol>\w+):\/\/(?P<domain>\w+\.\w+\.\w+)/";
preg_match_all($pattern, "http://www.baidu.com", $matches);
print_r($matches);

//结果
Array
(
    [0] => Array
        (
            [0] => http://www.baidu.com
        )
    [protocol] => Array
        (
            [0] => http
        )
    [1] => Array
        (
            [0] => http
        )
    [domain] => Array
        (
            [0] => www.baidu.com
        )

    [2] => Array
        (
            [0] => www.baidu.com
        )
)

后向引用

将前面某一分组匹配的结果作为新的匹配项

ab(\w{2})(\d+)\2\1

abcd22cd abcd22cc abcd21cd

零宽断言

零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已

1)=号的,是肯定匹配

2)< 号的 ,是写在前面的,取后面的值

3)!号的 ,是否定的

4)不带<号的,是写在后面的,取前面的值

一共4种

1)(?=xxx)

例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分

2)(?<=xxx)

例:(?<=\bre)\w+\b会匹配以re开头的单词的后半部分

3)(?!xxx)

例:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字

4)(?<!xxx)

例:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字

简单表达就是 :

等是叹否,有尖前取后,无尖后取前

Python中的re模块

1)findall

从字符串中查找出所有符合的字符串,并将结果放到列表中

import re

str = '''
aaaa
time=2021-2-23 17:55:22 operation=修改文章 operator=admin
time=2021-2-23 17:55:22 operation=修改标签 operator=user1
'''

pattern = re.compile(r'time=(.*?)\soperation=(.*?)\soperator=(.*)')
m = pattern.findall(str)
print(m)

结果

[('2021-2-23 17:55:22', '修改文章', 'admin'), ('2021-2-23 17:55:22', '修改标签', 'user1')]

Process finished with exit code 0

2)match

只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None

import re

str = 'time=2021-2-23 17:55:22 operation=修改文章 operator=admin'

pattern = re.compile(r'time=(.*?)\soperation=(.*?)\soperator=(.*)')
m = pattern.match(str)
print(m)
if m is not None:
    print(m.groups())

结果

<_sre.SRE_Match object; span=(0, 53), match='time=2021-2-23 17:55:22 operation=修改文章 operator=a>
('2021-2-23 17:55:22', '修改文章', 'admin')

Process finished with exit code 0

3)search

匹配整个字符串,直到找到一个匹配才返回,未找到返回None

import re

str = '''
aaaa
time=2021-2-23 17:55:22 operation=修改文章 operator=admin
time=2021-2-23 17:55:22 operation=修改标签 operator=user1
'''

pattern = re.compile(r'time=(.*?)\soperation=(.*?)\soperator=(.*)')
m = pattern.search(str)
print(m)
if m is not None:
    print(m.groups())

结果

<_sre.SRE_Match object; span=(6, 59), match='time=2021-2-23 17:55:22 operation=修改文章 operator=a>
('2021-2-23 17:55:22', '修改文章', 'admin')

Process finished with exit code 0

标签:匹配,22,正则表达式,55,30,重复,2021,pattern
From: https://www.cnblogs.com/sylvesterzhang/p/18089887

相关文章

  • 2021-4-10-达梦数据库
    模式、状态、状态切换、表空间、GROUPBY、JOIN语句报错、事务模式达梦数据库支持3中模式:Normal模式、Primary模式和Standby模式。1)Normal模式用户可以正常访问数据库,操作没有限制。正常生成本地归档,但不发送实时归档(Realtime)、即时归档(Timely)和异步归档(Async)。将数据......
  • 2021-6-20-h2
    特点、运行方式、开始特点支持全文检索,提供了内置全文检索和使用ApacheLuncene的全文索引对数据类型和SQL有很好的支持,兼容性好,便于移植支持嵌入式数据库、内存数据库、只读数据库等;能够通过浏览器操控数据库与SQLit相比较,读操作更快,但是在连接、写操作性能......
  • 2021-6-8-zookeeper
    概述、Zookeeper设计目的、zookeepr角色介绍、工作原理、应用场景、安装、命令、JAVA操作zookeeper概述它是一个分布式服务框架,是ApacheHadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项......
  • 2021-10-22-go语言基础
    概述、变量、常量、运算符和函数、导包、指针、defer、数组、切片、map、type使用、面向对象、反射、chanel、协程、json操作、随机数、网络编程、读取文件、beego概述1特性:自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发......
  • 2020-6-30-Docker
    基础概念、安装与卸载、命令、部署、可视化portainer、自制镜像、容器的卷技术、DockerFile、Docker网络、Springboot镜像、Compose基础概念1虚拟技术和容器技术对比虚拟技术容器技术原理虚拟出硬件,运行一个完整的操作系统容器应用直接运行在宿主机,无内核,相互隔离......
  • 搭建麒麟桌面操作系统V10 SP1 2303的内网全量仓库源
    来源:公众号鹏大圣运维作者:鹏大圣免责声明本文所有内容,只在测试环境中进行,如果您要使用文章中的内容对您的环境进行操作,请您一定知悉:所有的操作都会带来一定的风险,可能会导致系统崩溃等多种问题,切勿盲目操作,本公众号为您提供一种操作的思路,不对您的任何操作行为负责,请您知......
  • 【题目】【网络系统管理】2021年全国职业院校技能大赛模块B--样题(一)
    2021年全国职业院校技能大赛网络系统管理(样题1)模块B:Windows环境全国职业院校技能大赛执委会.技术专家组2021年03月目录一、赛题说明3(一)竞赛介绍3(二)密码3(三)竞赛时间3(四)竞赛注意事项3(五)竞赛结果文件的提交3二、项目任务描述4(一)基本配置4(二)拓扑图5三、......
  • 【题目】【网络系统管理】2021年全国职业院校技能大赛模块B--样题(二)
    2021年全国职业院校技能大赛网络系统管理(样题2)模块B:Windows环境全国职业院校技能大赛执委会.技术专家组2021年03月目录一、赛题说明3(一)竞赛介绍3(二)密码3(三)竞赛时间3(四)竞赛注意事项3(五)竞赛结果文件的提交3二、项目任务描述4(一)基本配置4(二)拓扑图5三、......
  • LKT4305GM芯片—网关数据安全解决方案
    随着互联网、智能终端等相关行业的飞速发展,对终端产品远程控制的需求在人们生活中越来越普遍。如何保障后台与终端产品之间数据安全交互、不被篡改、不被盗取成为产品安全性的主要问题。密钥管理和分配:方案中使用的对称密钥可以提前设置或采用临时生成方式;平台和终端存储自身的......
  • 基于STM32单片机图书馆智能节能灯热释人体感应光照设计21-304
    21-304、STM32图书馆智能节能灯设计-LCD1602-热释-光敏-拨动-KEY-RELAY产品功能描述:本设计由STM32F103C8T6单片机核心板电路+拨动开关电路+按键电路+2路继电器控制电路+热释人体红外模块电路+光照检测电路+LCD1602液晶显示电路+电源电路组成1、通过拨动开关选择系统工作模式......