正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串的模式。它广泛应用于文本查找、替换、验证等场景,尤其是在数据处理、网络爬虫、编程等领域非常有用。下面将详细介绍正则表达式的基本语法、常用元字符及操作符、分组与捕获等核心概念。
1. 基本结构与符号
元字符(Meta Characters)
正则表达式中的元字符有特殊含义,用于构建匹配模式。常用元字符如下:
元字符 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
. | 匹配除换行符以外的任意字符 | a.b | "acb", "a5b" |
^ | 匹配字符串开头 | ^hello | "hello world" |
$ | 匹配字符串结尾 | world$ | "hello world" |
* | 匹配前面的字符零次或多次 | ab* | "a", "ab", "abbb" |
+ | 匹配前面的字符一次或多次 | ab+ | "ab", "abbb" |
? | 匹配前面的字符零次或一次 | ab? | "a", "ab" |
{n} | 匹配前面的字符 n 次 | a{3} | "aaa" |
{n,m} | 匹配前面的字符 n 到 m 次 | a{2,4} | "aa", "aaa", "aaaa" |
[] | 字符集,匹配其中任意一个字符 | [abc] | "a", "b", "c" |
` | ` | 或运算,匹配左右表达式任意一个 | `a |
\ | 转义字符,取消元字符的特殊含义 | . | "." |
特殊字符集
一些特殊字符集用于简化匹配模式:
字符 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
\d | 匹配任意数字 [0-9] | \d | "0", "9", "123" |
\D | 匹配任意非数字 | \D | "a", "-", " " |
\w | 匹配字母、数字、下划线 | \w | "a", "1", "_" |
\W | 匹配非字母、数字、下划线 | \W | "!", " " |
\s | 匹配空白字符(空格、制表符等) | \s | " ", "\t", "\n" |
\S | 匹配非空白字符 | \S | "a", "1", "#" |
2. 常见操作符
操作符 | 含义 |
---|---|
* | 零次或多次匹配 |
+ | 一次或多次匹配 |
? | 零次或一次匹配 |
{n} | 精确匹配 n 次 |
{n,} | 至少匹配 n 次 |
{n,m} | 匹配 n 到 m 次 |
() | 分组和捕获 |
(?:...) | 非捕获组,不保存匹配结果 |
(?=...) | 正向预查,匹配后面为指定内容的情况 |
(?!..) | 负向预查,匹配后面不为指定内容的情况 |
3. 分组与捕获
分组(Group)用于将匹配结果分成多个部分,而捕获组可以保存匹配结果,方便后续处理。
- 捕获组:使用小括号 (),会保存匹配结果。
- 非捕获组 :使用 (?:...),不会保存匹配结果,仅用于匹配。
例如,正则(\d{3})-(\d{3,4})-(\d{4})
可以匹配并捕获电话号码,如123-456-7890
。分组后可以分别提取区号、主号码等。
4. 常见应用场景示例
(1) 匹配电子邮件地址
regex
^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,6}$
- 解释:+:以字母、数字、下划线、点、减号开头,出现一次或多次。@:匹配 @ 符号。[a-zA-Z\d.-]+:域名部分。.[a-zA-Z]{2,6}$:匹配顶级域名(如 .com, .org)。
(2) 匹配网址(URL)
regex
^https?:\/\/(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,6}\/?$
- 解释:^https?:匹配 http 或 https。😕/:匹配 😕/。(www.)?:匹配可选的 www.。[a-zA-Z0-9-]+.[a-zA-Z]{2,6}:匹配主域名和顶级域名。/?$:可选的结尾斜杠。
5. 编程示例(Python)
在 Python 中,可以使用 re
模块处理正则表达式。
python
import re
# 匹配邮件地址
email_regex = r"^[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,6}$"
email = "example@example.com"
if re.match(email_regex, email):
print("匹配成功:是一个有效的邮箱地址")
# 匹配电话号码
phone_regex = r"(\d{3})-(\d{3,4})-(\d{4})"
phone = "123-456-7890"
match = re.match(phone_regex, phone)
if match:
print(f"区号: {match.group(1)}, 主号: {match.group(2)}, 尾号: {match.group(3)}")
总结
正则表达式可以高效地匹配复杂字符串模式,但需要精确地定义匹配规则。熟练掌握正则表达式需要理解各种元字符、操作符及分组的作用,并在实际应用中不断练习。