正则表达式语法详解(python)

目录

引言

第一部分:正则表达式基础

[1. 什么是正则表达式?](#1. 什么是正则表达式?)

[2. 正则表达式的组成](#2. 正则表达式的组成)

[3. 正则表达式的执行过程](#3. 正则表达式的执行过程)

第二部分:常用正则表达式元字符

[1. 点号(.)](#1. 点号(.))

[2. 星号(*)](#2. 星号(*))

[3. 加号(+)](#3. 加号(+))

[4. 问号(?)](#4. 问号(?))

[5. 花括号({})](#5. 花括号({}))

[6. 方括号([])](#6. 方括号([]))

[7. 脱字符(^)](#7. 脱字符(^))

[8. 美元符号()](#8. 美元符号())

第三部分:高级正则表达式技巧

[1. 捕获组](#1. 捕获组)

[2. 反向引用](#2. 反向引用)

[3. 非捕获组](#3. 非捕获组)

[4. 前瞻断言与后瞻断言](#4. 前瞻断言与后瞻断言)

[5. 贪婪与非贪婪模式](#5. 贪婪与非贪婪模式)

第四部分:正则表达式实战案例

[1. 电子邮件地址验证](#1. 电子邮件地址验证)

[2. 电话号码提取](#2. 电话号码提取)

[3. HTML标签清理](#3. HTML标签清理)

第五部分:常见错误与陷阱

[1. 忘记转义特殊字符](#1. 忘记转义特殊字符)

[2. 误用量词导致的性能问题](#2. 误用量词导致的性能问题)

[3. 忽略字符编码问题](#3. 忽略字符编码问题)


引言

正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,广泛应用于各种编程语言和工具中。无论是用于搜索、替换、验证还是提取特定模式的数据,正则表达式都能提供高效且灵活的解决方案。本文将详细介绍正则表达式的基本概念、常用元字符、高级技巧以及实战案例,帮助读者从入门到精通。

第一部分:正则表达式基础

1. 什么是正则表达式?

正则表达式是一种描述字符串模式的语言。它允许你定义一个模式,然后用这个模式来匹配、查找、替换或验证字符串。正则表达式通常用于文本处理任务,如搜索和替换文本中的特定模式。

2. 正则表达式的组成
  • 字符集:普通字符(如字母、数字)和特殊字符(如元字符)。
  • 元字符 :具有特殊含义的字符,如 .*+ 等。
  • 量词 :指定字符或字符集出现的次数,如 *+?{}
  • 断言 :指定匹配条件,如 ^$\b
3. 正则表达式的执行过程

正则表达式引擎会从左到右扫描输入字符串,并尝试匹配定义的模式。如果找到匹配项,引擎会返回匹配的结果;否则,返回不匹配的结果。正则表达式引擎支持多种匹配模式,如贪婪匹配和非贪婪匹配。

第二部分:常用正则表达式元字符

1. 点号(.)
  • 含义:匹配除换行符外的任意单个字符。
  • 示例a.b 可以匹配 a1ba ba$b 等。
2. 星号(*)
  • 含义:匹配前一个字符零次或多次。
  • 示例ab*c 可以匹配 acabcabbc 等。
3. 加号(+)
  • 含义:匹配前一个字符一次或多次。
  • 示例ab+c 可以匹配 abcabbcabbbc 等。
4. 问号(?)
  • 含义:匹配前一个字符零次或一次。
  • 示例ab?c 可以匹配 acabc
5. 花括号({})
  • 含义:指定某个模式出现的具体次数。
  • 示例a{2,4} 可以匹配 aaaaaaaaa
6. 方括号([])
  • 含义:匹配方括号内的任一字符。
  • 示例[abc] 可以匹配 abc
7. 脱字符(^)
  • 含义:在方括号内表示非该范围内的字符;在字符串开头表示非此模式。
  • 示例[^abc] 可以匹配除 abc 以外的任何字符;^abc 表示以 abc 开头的字符串。
8. 美元符号($)
  • 含义:表示字符串的结尾。
  • 示例abc$ 表示以 abc 结尾的字符串。

第三部分:高级正则表达式技巧

1. 捕获组
  • 含义 :使用圆括号 () 创建捕获组,可以提取匹配的部分。
  • 示例(ab)c 可以匹配 abc,并且捕获组会捕获 ab
2. 反向引用
  • 含义 :利用捕获组实现复杂匹配,使用 \1\2 等反向引用。
  • 示例(\w+)\1 可以匹配连续两次出现的单词,如 testtest
3. 非捕获组
  • 含义 :使用 (?:...) 创建非捕获组,不会被捕获。
  • 示例(?:ab)c 可以匹配 abc,但不会捕获 ab
4. 前瞻断言与后瞻断言
  • 正向前瞻断言(?=...),匹配后面跟指定模式的字符串。
  • 负向前瞻断言(?!...),匹配后面不跟指定模式的字符串。
  • 正向后瞻断言(?<=...),匹配前面有指定模式的字符串。
  • 负向后瞻断言(?<!...),匹配前面没有指定模式的字符串。
  • 示例abc(?=def) 可以匹配 abc,但前提是后面必须跟着 def
5. 贪婪与非贪婪模式
  • 贪婪模式:量词默认是贪婪的,尽可能多地匹配字符。
  • 非贪婪模式 :在量词后加上 ?,尽可能少地匹配字符。
  • 示例a.*b 贪婪模式匹配 a...ba.*?b 非贪婪模式匹配 a...b 中的第一个 b

第四部分:正则表达式实战案例

1. 电子邮件地址验证
  • 需求:验证一个字符串是否符合电子邮件地址的格式。

  • 正则表达式^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

  • 示例

    python 复制代码
    import re
    
    email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    test_emails = ["example@example.com", "invalid-email", "user@domain.co.uk"]
    
    for email in test_emails:
        if re.match(email_pattern, email):
            print(f"{email} 是有效的电子邮件地址")
        else:
            print(f"{email} 是无效的电子邮件地址")
2. 电话号码提取
  • 需求:从文本中提取电话号码。

  • 正则表达式\d{3}-\d{3}-\d{4}

  • 示例

    python 复制代码
    import re
    
    phone_pattern = r'\d{3}-\d{3}-\d{4}'
    text = "请拨打 123-456-7890 或者 987-654-3210 联系我们。"
    
    phone_numbers = re.findall(phone_pattern, text)
    print("提取的电话号码:", phone_numbers)
3. HTML标签清理
  • 需求:从字符串中去除HTML标签。

  • 正则表达式<[^>]+>

  • 示例

    python 复制代码
    import re
    
    html_pattern = r'<[^>]+>'
    text = "<p>这是一个段落。</p><div>这是另一个段落。</div>"
    
    cleaned_text = re.sub(html_pattern, '', text)
    print("清理后的文本:", cleaned_text)

第五部分:常见错误与陷阱

1. 忘记转义特殊字符
  • 问题 :特殊字符如 ., *, +, ?, (, ), [, ], {, }, |, \ 需要转义。
  • 解决方法 :使用反斜杠 \ 转义特殊字符。
2. 误用量词导致的性能问题
  • 问题:贪婪量词可能导致正则表达式引擎进行大量不必要的回溯。
  • 解决方法:使用非贪婪量词或优化正则表达式。
3. 忽略字符编码问题
  • 问题:处理非ASCII字符时,忽略字符编码可能导致匹配失败。
  • 解决方法:确保正则表达式和输入字符串使用相同的字符编码
相关推荐
宛唐羁客28 分钟前
ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法
网络·数据库
吴半杯1 小时前
Redis-monitor安装与配置
数据库·redis·缓存
是桃萌萌鸭~2 小时前
mysqldbcompare 使用及参数详解
数据库·mysql
gma9992 小时前
brpc 与 Etcd 二次封装
数据库·c++·rpc·etcd
Yz98762 小时前
hive复杂数据类型Array & Map & Struct & 炸裂函数explode
大数据·数据库·数据仓库·hive·hadoop·数据库开发·big data
小鹿撞出了脑震荡2 小时前
SQLite3语句以及用实现FMDB数据存储的学习
数据库·学习·sqlite
小草儿7992 小时前
gbase8s之mysql的show命令实现
数据库·mysql
斯普信专业组2 小时前
MongoDB调优利器:掌握性能分析工具mongostat
数据库·mongodb·mongostat
.3 小时前
接口 测试
数据库·oracle
码到成功>_<3 小时前
Spring Boot实现License生成和校验
数据库·spring boot·后端