正则表达式regex

工具网站:RegExr: Learn, Build, & Test RegEx

正则表达式(Regular Expression, Regex)是一种强大的字符串匹配工具,广泛用于文本搜索、数据处理和输入验证等场景。无论是 Python、Java、JavaScript 还是 Shell 脚本,Regex 都是不可或缺的技能。

本文将深入介绍正则表达式的各种用法,包括:

  • 基本匹配(字母、数字)
  • 特殊符号 ^ $ \b
  • 量词 {} * + ?
  • 字符类 [] [^]
  • 贪婪与非贪婪匹配
  • 分组与反向引用
  • 前瞻与后顾
  • 实战应用

阅读完本教程,你将掌握正则表达式的核心知识,并能够熟练运用它解决实际问题。


1. 正则表达式基础

正则表达式由普通字符特殊字符组成。

1.1 匹配字母、数字

符号 作用 示例 匹配结果
a 匹配字母 a hello 中的 l l
abc 匹配连续字符串 abc abcdef abc
\d 任意数字 [0-9] a1b2c3 1 2 3
\w 单词字符 [a-zA-Z0-9_] var_name123 var_name123
\s 空白字符(空格、Tab、换行) hello world 空格

示例

import re

text = "My phone number is 123-456-7890"

pattern = r"\d{3}-\d{3}-\d{4}"

print(re.findall(pattern, text)) # 输出: ['123-456-7890']

2. ^ $ \b - 位置匹配

2.1 ^(匹配行首)

^hello 

匹配以 "hello" 开头的字符串:

  • hello world
  • world hello

2.2 $(匹配行尾)

world$ 

匹配以 "world" 结尾的字符串:

  • hello world
  • world hello

2.3 \b(单词边界)

\bcat\b 

匹配独立的 "cat"(前后不是字母或数字):

  • I have a cat.
  • catalog(不是完整单词)

3. 量词 * + ? {}

3.1 *(匹配 0 次或多次)

ab* 

匹配 "a" 后面跟 0 个或多个 "b"

  • a
  • ab
  • abb

3.2 +(匹配 1 次或多次)

ab+ 

匹配 "a" 后面跟 1 个或多个 "b"

  • a
  • ab
  • abb

3.3 ?(匹配 0 或 1 次,可选)

colou?r  

匹配 "color" 或 "colour"(u 可选):

  • color
  • colour

3.4 {n,m}(匹配 n 到 m 次)

\d{2,4} 

匹配 2 到 4 位数字

  • 12
  • 123
  • 1234
  • 1(太短)
  • 12345(太长)

4. 字符类 [] 和 取反 [^]

4.1 [](匹配括号内的任意字符)

gr[ae]y 

匹配 "gray""grey"

4.2 [^](匹配不在括号中的字符)

[^aeiou] 

匹配非元音字母

  • b
  • a

5. 贪婪与非贪婪匹配

5.1 贪婪匹配(默认行为)

".*" 

匹配 最长 的字符串:

  • 输入 He said, "Hello world!"
    • 贪婪匹配:"Hello world!"

5.2 非贪婪匹配(*? +? ??

".*?" 

匹配 最短 的字符串:

  • 输入 He said, "Hello world!"
    • 非贪婪匹配:"Hello"

6. 分组 () 与反向引用 \1

6.1 分组匹配

(\d{3})-(\d{3})-(\d{4}) 

匹配 电话号码,分组:

  • \1:前三位
  • \2:中间三位
  • \3:最后四位

6.2 反向引用

(\w+)\s+\1 

匹配连续重复的单词

  • hello hello
  • hello world

7. 前瞻 (?=...) 与 后顾 (?<=...)

7.1 正向前瞻(确保后面匹配但不包含)

\d+(?= dollars) 

匹配前面是数字,后面是 "dollars" 的数字

  • 100 dollars
  • 100 yen

7.2 负向前瞻(确保后面不匹配)

\d+(?! dollars) 

匹配前面是数字,后面不是 "dollars"

  • 100 yen
  • 100 dollars

7.3 正向后顾(确保前面匹配但不包含)

(?<=\$)\d+ 

匹配前面是 $ 的数字

  • $100
  • 100

8. 实战应用

8.1 过滤手机号

1[3-9]\d{9} 

8.2 提取 HTML 标签内容

<(\w+)>(.*?) 

8.3 过滤邮箱

[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}

你可能感兴趣的:(正则表达式)