正则表达式(Regular Expression,简称 Regex)是一种强大的文本模式匹配工具,用于搜索、提取、替换、验证等字符串处理任务。无论是网页爬虫、日志分析,还是表单校验、数据清洗,正则表达式都能大显身手。
一、什么是正则表达式?
正则表达式的本质是一种模式字符串,用于匹配符合特定规则的文本内容。可以将它想象成“模糊版的搜索关键词”:
1、普通字符匹配自身,如 abc 匹配 "abc"。
2、元字符构建模式规则,如 \d+ 匹配一串数字。
3、运算符与边界符可组合出更复杂的匹配需求,例如 ^abc$ 匹配整行 "abc"。
示例:
import re
print(re.match(r'^abc$', "abc")) # 匹配成功print(re.match(r'^abc$', "abcx")) # None,不匹配
二、基本语法规则
正则表达式语法主要包含以下几类:
1、字符类
字符类用于匹配文本中的单个字符,可指定范围或类别。
如: \d(数字)、\w(字母数字下划线)、.(任意字符)等。
import re
text = "hello 123 !"print(re.findall(r'\d+', text)) # ['123'],匹配数字print(re.findall(r'\w+', text)) # ['hello', '123'],匹配字母数字串
2、数量修饰符
数量修饰符用于控制前一个字符或分组的重复次数。
如: *(零次或多次)、+(一次或多次)、{n,m}(n 到 m 次)等。
import re
text = "ab abb abbb"print(re.findall(r'ab+', text)) # 匹配:一个 a 后跟至少一个 b# ['ab', 'abb', 'abbb']print(re.findall(r'ab{2,3}', text))# 匹配:一个 a 后跟 2~3 个 b# ['abb', 'abbb']
3、边界符
边界符不匹配字符,而是匹配位置。
如: ^(开头)、$(结尾)、\b(单词边界)等。
import re
text = "I am singing and running fast"print(re.findall(r'\b\w+ing\b', text)) # ['singing', 'running'],匹配以 ing 结尾的单词
4、分组与引用
通过括号 () 将模式分组,可以捕获子表达式,供后续引用或替换使用。
如: (abc)(捕获分组)、(?:abc)(非捕获组)。
import re
html = "<b>粗体</b><i>斜体</i>"print(re.findall(r'<(\w+)>(.*?)</\1>', html))# [('b', '粗体'), ('i', '斜体')],\1 引用第一个分组
更多基本语法说明,请参阅:
三、常见应用示例
下面结合 Python 的 re 模块演示常见场景。
示例 1:邮箱地址提取
import re
text = "请联系邮箱 admin@test.com 或 hr@company.org"emails = re.findall(r'\b\w+@\w+\.\w+\b', text)print(emails) # ['admin@test.com', 'hr@company.org']
解读: \w+ 匹配用户名,@ 固定,\w+\.\w+ 匹配域名和后缀。
示例 2:手机号验证
import re
pattern = r'^1[3-9]\d{9}$'print(re.match(pattern, "13800138000") is not None) # Trueprint(re.match(pattern, "123456") is not None) # False
解读:^...$ 保证整串匹配;1[3-9] 限定第二位;\d{9} 要求后面是 9 位数字。
整体而言,就是:以 1 开头,第二位是 3–9,后面跟 9 位数字,并且总长必须是 11 位 的字符串。
示例 3:替换敏感信息
import re
text = "我的手机号是:13812345678"masked = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', text)print(masked) # 我的手机号是:138****5678
解读:利用分组保留前 3 位和后 4 位,中间替换为 ****。
示例 4:分割文本
import res = "apple, banana; orange kiwi"words = re.split(r'[,\s;]+', s)print(words) # ['apple', 'banana', 'orange', 'kiwi']
解读:[,\s;]+ 表示逗号、空格或分号,连续出现时也能正确切分。
四、高级用法
正则不仅能做基础匹配,还能处理复杂情况。
1、懒惰匹配
.*? 尽量少匹配,而不是贪婪地匹配所有。
2、零宽断言
(?=...)、(?!...)、(?<=...)、(?<!...),可以限定前后条件但不消耗字符。
3、命名分组
(?P<name>...) 给分组命名,方便调用。
4、嵌套分组与反向引用
常用于匹配成对结构,如 <tag>内容</tag>。
这些技巧在 HTML/XML 标签解析、复杂日志分析、精确表单校验中非常常用。
更多说明请参阅:
五、使用建议与注意事项
正则表达式虽然强大,但也存在一些局限和陷阱,使用时要注意:
1、正则不是万能工具
能用字符串方法就不要强行写复杂正则。
2、善用调试工具
推荐使用 regex101.com 进行可视化调试。
3、大小写匹配
默认区分大小写,可用 re.IGNORECASE 忽略。
4、多行与单行模式
re.MULTILINE:让 ^、$ 匹配每行开头和结尾。
re.DOTALL:让 . 匹配换行符。
5、使用原始字符串 r''
避免写成 '\\d+' 这样的冗余形式。
6、注意性能
避免嵌套量词 (a+)+ 等写法,以免引发灾难性回溯。
📘 小结
正则表达式是文本处理的利器,掌握它能极大提升工作效率。
相关链接:
“点赞有美意,赞赏是鼓励”