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

python笔记之正则篇(四)

使用正则表达式

语法介绍

正则表达式是一种强大的文本模式匹配工具,它使用特定的语法来描述字符串的模式。下面我将详细解释正则表达式的各种语法元素。

字符匹配

1. 普通字符

大多数字符(字母、数字)直接匹配自身:
a 匹配字符 “a”
5 匹配数字 “5”
@ 匹配符号 “@”

2. 特殊字符(需要转义)

这些字符在正则表达式中有特殊含义,如果要匹配它们本身,需要使用反斜杠 \ 转义:

# . ^ $ * + ? { } [ ] \ | ( )
# 匹配点号
\.  # 匹配星号
\*  # 匹配问号
\?  
3. 字符类

使用方括号 [] 定义一个字符类,匹配其中任意一个字符:
[aeiou] 匹配任意一个元音字母
[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[0-9] 匹配任意数字
[a-zA-Z0-9] 匹配任意字母或数字

否定字符类:在字符类开头使用 ^ 表示不匹配这些字符:
[^aeiou] 匹配任意非元音字符
[^0-9] 匹配任意非数字字符

4. 预定义字符类

. 匹配除换行符外的任意字符
\d 匹配任意数字,等价于 [0-9]
\D 匹配任意非数字,等价于 [^0-9]
\s 匹配任意空白字符(空格、制表符、换行符等)
\S 匹配任意非空白字符
\w 匹配单词字符(字母、数字、下划线),等价于 [a-zA-Z0-9_]
\W 匹配非单词字符,等价于 [^a-zA-Z0-9_]

量词(重复匹配)

1. 基本量词
  • 匹配前面的元素零次或多次
  • 匹配前面的元素一次或多次

? 匹配前面的元素零次或一次

2. 精确量词

{n} 匹配前面的元素恰好 n 次

{n,} 匹配前面的元素至少 n 次

{n,m} 匹配前面的元素至少 n 次,但不超过 m 次

3. 贪婪与非贪婪匹配

默认情况下,量词是"贪婪的",会尽可能多地匹配字符。在量词后添加 ? 可使其变为"非贪婪"或"惰性"的,即尽可能少地匹配字符。

# 贪婪匹配:匹配尽可能多的字符
a.*b  # 在 "aabab" 中匹配 "aabab"# 非贪婪匹配:匹配尽可能少的字符
a.*?b # 在 "aabab" 中匹配 "aab" 和 "ab"

位置锚点

1. 字符串边界

^ 匹配字符串的开头(在多行模式下匹配行的开头)
$ 匹配字符串的结尾(在多行模式下匹配行的结尾)

# 匹配以 "Hello" 开头的字符串
^Hello# 匹配以 "world" 结尾的字符串
world$# 匹配整个字符串就是 "hello"
^hello$
2. 单词边界

\b 匹配单词边界(单词字符与非单词字符之间的位置)
\B 匹配非单词边界

# 匹配独立的单词 "the"
\bthe\b# 匹配包含 "the" 但不作为独立单词
\Bthe\B

分组与捕获

1. 基本分组

使用圆括号 () 创建分组:
(abc) 匹配 “abc” 并捕获匹配项

# 匹配 "abc" 重复两次
(abc){2}  # 匹配 "abcabc"
2. 非捕获分组

使用 (?😃 创建不捕获的分组(不会记住匹配的内容):
(?:abc) 匹配 “abc” 但不捕获

# 匹配 "abc" 或 "def" 但不捕获分组
(?:abc|def)
3. 命名分组

使用 (?P) 语法创建命名分组:
(?P\d{4}) 匹配4位数字并命名为 “year”

# 匹配日期并命名各部分
(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})
4. 反向引用

使用 \n(n 是数字)引用前面捕获的分组:
(a)\1 匹配 “aa”
(a)(b)\2\1 匹配 “abba”

# 匹配重复的单词
\b(\w+)\b\s+\1\b  # 匹配 "the the" 或 "hello hello"

选择与条件

1. 选择符

使用竖线 | 表示"或"的关系:
cat|dog 匹配 “cat” 或 “dog”
(a|b)c 匹配 “ac” 或 “bc”

# 匹配多种颜色
red|green|blue|yellow
2. 条件表达式

使用 (?(condition)yes-pattern|no-pattern) 语法创建条件匹配:
(?(1)a|b) 如果第一个捕获组匹配成功,则匹配 “a”,否则匹配 “b”

# 如果前面有 $ 则匹配数字,否则匹配单词
(\$)?[0-9]+(?(1)|[a-z]+)

断言(零宽度断言)

1. 前瞻断言

(?=pattern) 正向前瞻:匹配后面跟着 pattern 的位置
(?!pattern) 负向前瞻:匹配后面不跟着 pattern 的位置

# 匹配后面跟着 "元" 的数字
\d+(?=)  # 在 "100元" 中匹配 "100"# 匹配后面不跟着 "元" 的数字
\d+(?!元)  # 在 "100美元" 中匹配 "100"
2. 后顾断言

(?<=pattern) 正向后顾:匹配前面是 pattern 的位置
(?<!pattern) 负向后顾:匹配前面不是 pattern 的位置

# 匹配前面是 "$" 的数字
(?<=\$)\d+  # 在 "$100" 中匹配 "100"# 匹配前面不是 "$" 的数字
(?<!\$)\d+  # 在 "100¥" 中匹配 "100"

修饰符(模式标志)

修饰符可以改变正则表达式的匹配行为,通常放在表达式开头或作为参数传递:
i 忽略大小写:/hello/i 匹配 “hello”、“Hello”、“HELLO” 等
m 多行模式:使 ^ 和 $ 匹配每行的开头和结尾,而不是整个字符串的开头和结尾
s 单行模式(Dotall):使 . 匹配包括换行符在内的所有字符
x 详细模式:忽略空白和注释,使正则表达式更易读
g 全局匹配:找到所有匹配而不仅仅是第一个
u Unicode 模式:正确处理 Unicode 字符

# 使用修饰符
(?i)hello    # 忽略大小写匹配 "hello"
(?m)^hello   # 多行模式下匹配每行开头的 "hello"
(?s)a.b      # 使 "." 匹配换行符,可以匹配 "a\nb"

Unicode 支持

1. Unicode 属性

\p{Property} 匹配具有指定 Unicode 属性的字符
\P{Property} 匹配不具有指定 Unicode 属性的字符

# 匹配中文字符
\p{Han}# 匹配所有字母
\p{L}# 匹配所有数字
\p{N}
2. Unicode 字符类

\p{Lu} 匹配大写字母
\p{Ll} 匹配小写字母
\

http://www.dtcms.com/a/391627.html

相关文章:

  • 无标题文档
  • LeetCode 面试经典 150 题之验证回文串:双指针解题思路详解
  • pandas在AI中与其他库的协作
  • 【软件测试】第5章 测试分类(下)
  • 二物理层-真题-
  • c康复训练 01
  • MLP和CNN在图片识别中的对比——基于猫狗分类项目的实战分析
  • Node-Choice
  • PyQt6之滚动条
  • 使用OpenVINO将PP-OCRv5模型部署在Intel显卡上
  • 【图像处理基石】图像复原方面有哪些经典算法?
  • setTimeout定时器不生效- useRef 的特点/作用
  • 钻井的 “导航仪”:一文读懂单点、多点与随钻测量
  • CKS-CN 考试知识点分享(8) ingress 公开 https 服务
  • ​​[硬件电路-259]:LM4040AIM3 精密电压基准源: 管脚定义、概述、功能、技术指标、使用场景、原理
  • C语言:实现阶乘和计算
  • 鸿蒙应用开发——AppStorageV2和PersistenceV2的使用
  • shell脚本实现docker镜像批量保存并上传至Harbor仓库
  • 用 EzCaptcha 优化 reCAPTCHA 低通过率问题
  • 在docker中构建Vue项目
  • 力扣1895. 最大的幻方
  • Linux入门(四)
  • 以下是与LoRa技术相关的数学公式整理
  • (3) rust和前端交互
  • TextFlux重磅发布:告别复杂控制信号!多语种高保真场景文本编辑新时代
  • A股大盘数据-20250919分析
  • [x-cmd] X-CMD 的依赖非常精简,即装即用,无需额外配置
  • TM52F1363 电子元器件 海速芯 8位高性能微控制器(MCU)技术解析
  • 打工人日报#20250919
  • vue3学习日记(十九):组件实例详解