正则表达式规则
正则元字符和特性
字符匹配
- 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 "a" 将匹配到文本中的 "a" 字符。
- 元字符:元字符具有特殊的含义,例如
\d匹配任意数字字符,\w匹配任意字母数字字符,.匹配任意字符(除了换行符)等。
量词
*:匹配前面的模式零次或多次。+:匹配前面的模式一次或多次。?:匹配前面的模式零次或一次。{n}:匹配前面的模式恰好 n 次。{n,}:匹配前面的模式至少 n 次。{n,m}:匹配前面的模式至少 n 次且不超过 m 次。
字符类
[ ]:匹配括号内的任意一个字符。例如,[abc]匹配字符 "a"、"b" 或 "c"。[^ ]:匹配除了括号内的字符以外的任意一个字符。例如,[^abc]匹配除了字符 "a"、"b" 或 "c" 以外的任意字符。
边界匹配
^:匹配字符串的开头。$:匹配字符串的结尾。\b:匹配单词边界。\B:匹配非单词边界。
分组和捕获
( ):用于分组和捕获子表达式。(?: ):用于分组但不捕获子表达式。
特殊字符
\:转义字符,用于匹配特殊字符本身。.:匹配任意字符(除了换行符)。|:用于指定多个模式的选择。
一、什么是正则表达式?
正则表达式(Regular Expression)是一种用于匹配、查找和替换文本中特定字符模式的工具。它通过一套特殊的语法规则,能够灵活地描述字符串模式,广泛应用于数据验证、文本处理、爬虫等场景。
二、核心语法速查表
1. 基本匹配符
| 符号 | 说明 | 示例 |
|---|---|---|
abc | 精确匹配字符串"abc" | "abc"匹配 "abc" |
. | 匹配除换行符外的任意单个字符 | a.c匹配 "abc", "adc" |
\ | 转义字符 | \.匹配点号本身 |
2. 字符类
| 符号 | 说明 | 示例 |
|---|---|---|
[abc] | 匹配a、b或c中的任意一个 | [aeiou]匹配任意元音 |
[^abc] | 匹配除a、b、c外的任意字符 | [^0-9]匹配非数字 |
[a-z] | 匹配a到z范围内的任意字符 | [A-Za-z]匹配任意字母 |
\d | 匹配数字,等价于[0-9] | \d\d匹配两位数字 |
\D | 匹配非数字 | \D+匹配连续的非数字 |
\w | 匹配单词字符(字母、数字、下划线) | \w+匹配一个单词 |
\W | 匹配非单词字符 | \W匹配空格或标点 |
\s | 匹配空白字符(空格、制表符等) | \s+匹配连续空白 |
\S | 匹配非空白字符 | \S{3}匹配三个非空白字符 |
3. 量词
| 符号 | 说明 | 示例 |
|---|---|---|
* | 匹配前面的子表达式0次或多次 | ab*c匹配 "ac", "abc", "abbc" |
+ | 匹配前面的子表达式1次或多次 | ab+c匹配 "abc", "abbc" |
? | 匹配前面的子表达式0次或1次 | colou?r匹配 "color", "colour" |
{n} | 精确匹配n次 | \d{4}匹配4位数字 |
{n,} | 至少匹配n次 | a{2,}匹配至少两个a |
{n,m} | 匹配n到m次 | \d{2,4}匹配2-4位数字 |
4. 位置锚点
| 符号 | 说明 | 示例 |
|---|---|---|
^ | 匹配字符串的开始位置 | ^Hello匹配以Hello开头的字符串 |
$ | 匹配字符串的结束位置 | end$匹配以end结尾的字符串 |
\b | 匹配单词边界 | \bword\b精确匹配单词"word" |
\B | 匹配非单词边界 | \Bword匹配作为单词一部分的"word" |
5. 分组与捕获
| 符号 | 说明 | 示例 |
|---|---|---|
(abc) | 捕获分组 | (ab)+匹配 "abab" |
(?:abc) | 非捕获分组 | 只分组不捕获,提高性能 |
\1 | 反向引用,引用第一个捕获组 | (a)b\1匹配 "aba" |
(?<name>exp) | 命名捕获组 | (?<year>\d{4}) |
6. 逻辑与条件
| 符号 | 说明 | 示例 |
|---|---|---|
| | 或运算 | cat|dog匹配 "cat" 或 "dog" |
(?=exp) | 正向先行断言 | \d+(?=元)匹配"元"前的数字 |
(?!exp) | 负向先行断言 | \d+(?!元)匹配后面不是"元"的数字 |
(?<=exp) | 正向后行断言 | (?<=¥)\d+匹配"¥"后的数字 |
(?<!exp) | 负向后行断言 | (?<!¥)\d+匹配前面不是"¥"的数字 |
三、示例
1.基础分组
(abc) # 将abc作为一个整体 (ab)+ # 匹配"ab"、"abab"、"ababab"等 (ha){3} # 匹配"hahaha"示例:
正则: (ha){3} 匹配: "hahaha" ✓ 不匹配: "haha" ✗2. 捕获分组(Capturing Groups)
默认情况下,括号不仅用于分组,还会捕获匹配的内容,以便后续引用。
编号捕获
(\d{4})-(\d{2})-(\d{2}) # 第1组:年份 # 第2组:月份 # 第3组:日期应用示例(Python):
import re text = "日期:2023-12-25" pattern = r'(\d{4})-(\d{2})-(\d{2})' match = re.search(pattern, text) print(match.group(0)) # 整个匹配:2023-12-25 print(match.group(1)) # 第1组:2023 print(match.group(2)) # 第2组:12 print(match.group(3)) # 第3组:25 print(match.groups()) # 所有组:('2023', '12', '25')3. 反向引用(Backreferences)
在同一正则表达式中引用之前捕获的组。
# 匹配重复单词 (\b\w+\b)\s+\1 # \1引用第1组捕获的内容
示例:
文本:"hello hello world" 正则:(\b\w+\b)\s+\1 匹配:"hello hello" 文本:"the the the" 正则:(\b\w+\b)(\s+\1){2} 匹配:"the the the"断言(Assertions)
断言不匹配字符,只检查位置或条件。
2.1 先行断言(Lookahead)
检查当前位置后面是否满足条件。
正向先行断言(?=exp):后面必须跟着exp
# 匹配后面是"元"的数字 \d+(?=元) # 示例: "价格:100元" → 匹配"100" "数量:100个" → 不匹配
负向先行断言(?!exp):后面不能跟着exp
# 匹配后面不是"元"的数字 \d+(?!元) # 示例: "数量:100个" → 匹配"100" "价格:100元" → 不匹配
2.2 后行断言(Lookbehind)
检查当前位置前面是否满足条件。
正向后行断言(?<=exp):前面必须是exp
# 匹配前面是"¥"的数字 (?<=¥)\d+ # 示例: "价格:¥100" → 匹配"100" "价格:100元" → 不匹配
负向后行断言(?<!exp):前面不能是exp
# 匹配前面不是"¥"的数字 (?<!¥)\d+ # 示例: "价格:100元" → 匹配"100" "价格:¥100" → 不匹配
