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} 匹配小写字母
\