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

10 正则表达式

文章目录

  • 1 匹配规则
    • 1. 普通字符
    • 2. 元字符
    • 3. 量词 - 控制字符出现的次数
    • 4. 位置锚点 - 匹配位置,而不是字符
    • 5. 分组与捕获
    • 6. 选择符
  • 2 Python应用
    • 2.1 re模块
    • 2.2 字符串分割
    • 2.3 分组
    • 2.4 预编译

1 匹配规则

1. 普通字符

大多数字符(字母、数字、汉字)就是普通字符,它们匹配自己。

  • abc 匹配字符串中的 "abc"
  • 你好 匹配字符串中的 "你好"

2. 元字符

  • . (点号):匹配任意一个字符(除了换行符 \n)。
    • a.c 匹配 "abc", "a@c", "a c"
  • \d:匹配任意一个数字。等价于 [0-9]
    • \d\d 匹配 "12", "05"
  • \w:匹配任意一个字母、数字或下划线。等价于 [A-Za-z0-9_]
    • \w\w 匹配 "Ab", "a1", "_x"
  • \s:匹配任意一个空白字符(包括空格、制表符 \t、换行符 \n 等)。
  • \D, \W, \S:分别是 \d, \w, \s反面
    • \D 匹配非数字的任意字符。
  • [...] (字符组):匹配方括号内的任意一个字符。
    • [aeiou] 匹配任意一个元音字母。
    • [a-z] 匹配任意一个小写字母(- 表示范围)。
    • [0-9a-fA-F] 匹配一个十六进制数字。
  • [^...] (否定字符组):匹配不在方括号内的任意一个字符。
    • [^0-9] 匹配任意一个非数字字符。

3. 量词 - 控制字符出现的次数

  • *:匹配零次或多次
    • ab*c 匹配 "ac" (0次b), "abc" (1次b), "abbc" (多次b)
  • +:匹配一次或多次
    • ab+c 匹配 "abc", "abbc",但不匹配 "ac"
  • ?:匹配零次或一次(即可选的)。
    • colou?r 匹配 "color""colour" (u出现0次或1次)
  • {n}:匹配确定的 n 次
    • \d{4} 匹配恰好4个数字,如 "2024"
  • {n,}:匹配至少 n 次
    • \d{2,} 匹配至少2个数字,如 "12", "123"
  • {n,m}:匹配至少 n 次,最多 m 次
    • \d{2,4} 匹配2到4个数字,如 "12", "123", "2024"

4. 位置锚点 - 匹配位置,而不是字符

  • ^:匹配字符串的开始位置。
    • ^Hello 匹配以 "Hello" 开头的字符串。
  • $:匹配字符串的结束位置。
    • world!$ 匹配以 "world!" 结尾的字符串。
  • \b:匹配一个单词的边界(即单词开头或结尾的空隙)。
    • \bcat\b 匹配单词 "cat",但不匹配 "category""scatter" 中的 "cat"

5. 分组与捕获

  • (...)
    1. 分组:将多个字符组合成一个整体,以便对其使用量词。
      • (abc)+ 匹配 "abc", "abcabc"
    2. 捕获:提取匹配到的内容,供后续使用或替换。
      • 在替换操作中,可以用 $1, $2 来引用被括号捕获的内容。
  • (?:...)非捕获分组。只分组,不捕获,提高效率。

6. 选择符

  • |:表示“或”关系。
    • cat|dog 匹配 "cat""dog"
    • gr(a|e)y 匹配 "gray""grey"
# []表示范围,只匹配一个字符
[abc]           只能是 a b c 其中之一
[a-zA-Z]        a到z 或 A到Z# ^ 表示 非
[^abc]          除 a b c 之外的任何字符# && 表示 且
[a-z&&[^e-g]]   a 到 z 且 除了 e 到 g(等同于[a-dh-z]# | 表示 或
[a-z|A-Z]       小写字母或大写字母# 预定义字符
.    任何字符
\d   数字
\s   空白字符
\w   英文字母、数字、下划线\D   非数字
\S   非空白字符
\W   非英文字母、数字、下划线# 数量词
x?       0个或1个x
x*       0个或多个x
x+       1个或多个x
x{n}     正好n个x
x{n,}    至少n个x
x{n, m}  n到m个x# \ 转义字符
[0-9]\-[0-9]   数字-数字# ^ 必须是开头  $ 必须是结尾
^hello    可以匹配 hello world  不能匹配 say hello
world$    可以匹配 hello world  不能匹配 world peace

2 Python应用

2.1 re模块

re模块中包含正则表达式的所有功能,因为Python本来也有转义字符\,所以\\才能表示\,为了方便,我们可以直接使用r''去除转义功能。
使用re.match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:

import re
if re.match(r'正则表达式', str):print('ok')
else:print('failed')

2.2 字符串分割

使用正则表达式分割字符串比常规的split()方法更加强大。

# 普通split()
'1   2 3  4'.split(' ')   # ['1', '', '', '2', '3', '', '4']# 正则split()
re.split(r'正则表达式', str)re.split(r'\s+', '1   2 3   4')  # ['1', '2', '3', '4']re.split(r'[\s,;]+', '1  , 2,;, 3 ,4')  # ['1', '2', '3', '4']

2.3 分组

()表示要提取的分组,如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。
group()group(0)表示匹配的完整字符串,group(1)group(2)依次代表第1、第2个子串,以此类推。

import re  qq = 'qq:12345678'  
reg = r'^(qq):([1-9]\d{4,9})$'  
m = re.match(reg, qq)  
print(m)  
print(m.group())  # qq:12345678
print(m.group(0))  # qq:12345678
print(m.group(1))  # qq
print(m.group(2))  # 12345678

2.4 预编译

如果一个正则表达式要用很多次,可以使用预编译。

import re# 预编译
re_qq = re.compile(r'^(qq):([1-9]\d{4,9})$')# 使用
print(re_qq.match('qq:41532531').group(2))

文章转载自:

http://uJiCFuh7.tbqdm.cn
http://CL0MtKld.tbqdm.cn
http://h1FtpoXD.tbqdm.cn
http://YZV14U9j.tbqdm.cn
http://1kr4GBFY.tbqdm.cn
http://dujxR98M.tbqdm.cn
http://ovTfk10X.tbqdm.cn
http://roVT96W1.tbqdm.cn
http://xVq9F27m.tbqdm.cn
http://rD3xMpos.tbqdm.cn
http://ByT98zCy.tbqdm.cn
http://mz2wlHDI.tbqdm.cn
http://opSGi1O2.tbqdm.cn
http://fIe9XvM3.tbqdm.cn
http://6wJwtzMu.tbqdm.cn
http://rMI1WxQ2.tbqdm.cn
http://PPgdrdop.tbqdm.cn
http://RbTDQ7eJ.tbqdm.cn
http://YIRvDaKN.tbqdm.cn
http://gJGI4iWS.tbqdm.cn
http://hB81YGH1.tbqdm.cn
http://XhxVrDdz.tbqdm.cn
http://RxFX4AXZ.tbqdm.cn
http://mVCmhyZe.tbqdm.cn
http://BTfPvXrW.tbqdm.cn
http://sGEHqcpd.tbqdm.cn
http://0TxtCBHO.tbqdm.cn
http://X2s9WR1i.tbqdm.cn
http://Dtl30CKq.tbqdm.cn
http://T5YBPUNj.tbqdm.cn
http://www.dtcms.com/a/386782.html

相关文章:

  • 本地文件->RTSP->HLS->网页播放
  • 148.排序链表,23.合并K个升序链表
  • 思特威CMOS sensor rbrow寄存器设置需要注意的事项(二)
  • 物联网精准节能平台:工厂“数字大脑”如何让节能更智能?
  • Java进阶教程,全面剖析Java多线程编程,实现Callable接口实现多线程,笔记05
  • Windows Server Web 服务器安全防护(开放 HTTP端口,限制恶意 IP)
  • 深度学习:从预备知识到未来展望
  • 数据库(五)MySQL的数据备份
  • linux的tar命令详细使用
  • 德克西尔断链保护器:守护工业生产的“安全屏障”
  • 自动化脚本的核心引擎
  • 【LeetCode 每日一题】3025. 人员站位的方案数 I——(解法一)暴力枚举
  • α-β-γ 滤波器推导(例 1:均值滤波的递推形式)
  • el-upload上传文件自定义
  • 只有select权限,确实也可以for update锁表
  • HBase核心知识点总结
  • Springboot 使用缓存cache
  • 基于边缘计算的智能管控终端充电站有序充电系统设计与实现 —— 面向实时功率调度需求
  • Nordic BLE智能门锁应用
  • IDEA 连接MySQL数据导出和导入指南
  • 在window下使用visual studio + cmake gui 源码编译 gRPC
  • C# halcon 拼图例子
  • 网络:常见的高速网卡(100Gbps和400Gbps)
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站)
  • 华为P10plus adb 无线调试USB拔除后立即失效解决
  • openharmony 鸿蒙 下 利用蓝牙API(a2dp模块-高级音频,ble模块-低功耗蓝牙等)完成对蓝牙音响的控制(蓝牙广播)
  • 软考-系统架构设计师 需求工程详细讲解
  • 优化 Coze Studio 依赖管理:镜像源配置与高效实践
  • AIGC入门,从理解通信协议sse与streamhttp开始
  • cuda编程笔记(20)-- 混合精度计算