Python:正则表达式基础语法

发布于:2025-09-01 ⋅ 阅读:(19) ⋅ 点赞:(0)

正则表达式的语法规则丰富多样,但核心内容主要集中在字符类、数量修饰符、边界与位置、分组与引用这四大类。掌握这些,就能写出 80% 的常见正则表达式。

在 Python 中书写正则时,推荐使用原始字符串,如 r'\d+',避免写成 '\\d+' 这种冗余形式。

一、字符类

Character Classes

字符类用于匹配文本中的单个字符,可以指定范围或类别。

. :匹配任意单个字符(除换行符)。

\d :匹配一个数字,等价于 [0-9]。

\D :匹配一个非数字。

\w :匹配字母/数字/下划线,等价于 [A-Za-z0-9_]。

\W :匹配非字母/数字/下划线。

\s :匹配空白字符(空格、制表符、换行)。

\S :匹配非空白字符。

[abc] :匹配集合中的任意一个字符。

[^abc] :匹配不在集合中的任意一个字符。

[a-z] :匹配小写字母范围;[A-Z] 匹配大写字母范围。

[0-9] :匹配 0 到 9 之间的任意一位数字。

[A-Za-z0-9]:匹配字母和数字。

注意:

1、若要匹配特殊符号本身(如 ., *, \),需用反斜杠转义,例如 \. 匹配句号。

2、字符类中,- 表示范围,若要匹配 - 本身,建议写在开头或结尾,如 [-abc] 或 [abc-]。

3、在字符类开头的 ^ 表示取反,如 [^0-9] 匹配非数字。

示例:匹配所有由字母或数字组成的单词

import re
text = "hello 123 !"print(re.findall(r'\w+', text))# ['hello', '123']

解读:\w+ 表示由一个或多个字母/数字/下划线组成的字符串,因此匹配到 hello 和 123。

二、数量修饰符

Quantifiers

数量修饰符用于控制前一个字符或分组的重复次数。

* :重复 0 次或多次。

+ :重复 1 次或多次。

? :重复 0 次或 1 次。

{n} :恰好重复 n 次。

{n,} :至少重复 n 次。

{n,m} :重复 n 到 m 次之间。

默认是贪婪匹配。即,尽可能多地匹配。

如果想改为非贪婪,可以在量词后加 ?:

*? :尽可能少地匹配零次或多次。

+? :尽可能少地匹配一次或多次。

?? :尽可能少地匹配零次或一次。

示例 1:匹配 2 到 4 位数字

import re
text = "12 345 6789"print(re.findall(r'\d{2,4}', text))# ['12', '345', '6789']

解读:\d{2,4} 表示匹配 2 ~ 4 个连续数字,结果正好对应不同长度的数字串。

示例 2:贪婪与非贪婪的对比

import re
text = "acbcb"print(re.findall(r'a.+b', text))    # ['acbcb'] 贪婪,吃到最后一个 bprint(re.findall(r'a.+?b', text))   # ['acb']   非贪婪,停在第一个 b

三、边界与位置

Anchors & Boundaries

边界符不匹配字符,而是匹配位置。

^ :匹配字符串开头。

$ :匹配字符串结尾。

\b :单词边界(单词与空格/标点的分界)。

\B :非单词边界。

\A :匹配字符串开始(即使在 MULTILINE 模式下也只匹配整个字符串开头)。

\Z :匹配字符串结束(即使在 MULTILINE 模式下也只匹配整个字符串结尾)。

\G :匹配上一次匹配结束的位置(高级用法,较少使用)。

提示:

在 re.MULTILINE 模式下,^ 和 $ 可以匹配每一行的开头和结尾,而 \A 和 \Z 只匹配整个字符串的开头和结尾。

示例:匹配所有以 “ing” 结尾的单词

import re
text = "I am singing and running fast"print(re.findall(r'\b\w+ing\b', text))# ['singing', 'running']

解读:\b 保证 ing 出现在单词边界处,从而避免匹配到更长单词的中间部分。

四、分组与引用

Grouping & Backreference

通过括号 () 将模式分组,可以捕获子表达式,供后续引用或替换使用。

(abc) :捕获分组,结果可用 \1、\2 … 引用。

(?:abc) :非捕获分组,只做逻辑分组,不保存结果。

(?P<name>abc) :命名捕获分组,可通过组名调用。

示例 1:分组与反向引用

import re
html = "<b>粗体</b><i>斜体</i>"print(re.findall(r'<(\w+)>(.*?)</\1>', html))# [('b', '粗体'), ('i', '斜体')]

解读:(\w+) 捕获标签名,\1 引用第一个分组,保证起始和结束标签相同。

示例 2:命名分组

import re
text = "2025-09-01"m = re.match(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', text)print(m.group('year'), m.group('month'), m.group('day'))# 2025 09 01

 解读:用 ?P<name> 给分组命名,可读性更好,方便直接通过组名访问。

示例 3:分组替换

import re
text = "123-456-7890"masked = re.sub(r'(\d{3})-\d{3}-(\d{4})', r'\1-***-\2', text)print(masked)# 123-***-7890

解读:(\d{3}) 和 (\d{4}) 分别对应分组 1 和分组 2,在替换时用 \1、\2 复用。如果是命名分组,还可以用 \g<name> 来替换。

📘 小结

正则表达式的基础语法规则主要包括:

字符类:决定能匹配什么样的字符

数量修饰符:决定匹配多少个字符

边界符:决定匹配发生在什么位置

分组与引用:让模式更灵活,可重复利用

图片

“点赞有美意,赞赏是鼓励”