10分钟学会Python正则表达式

10分钟学会Python正则表达式

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。

这篇文章将用最简洁的例子,让你在10分钟内掌握 Python 正则表达式的基础用法,足以应对日常开发中的大部分场景。

1. 什么是正则表达式?

简单来说,正则表达式就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式 ab+ 描述的特征是 “一个 a 和 任意个 b ”,那么 ab, abb, abbbbbbbbbb 都符合这个特征。

2. Python中的re模块

在Python中,我们需要使用 re 模块来操作正则表达式。首先,我们需要导入它:

python
import re

3. 基础语法

以下是一些最常用的正则表达式元字符:

| 元字符 | 描述 | 示例 | 匹配结果 (在字符串 "abc123def456" 中) |
| ------ | ---------------------------------------- | ------------- | --------------------------------- |
| . | 匹配任意单个字符(除了换行符) | a.c | abc |
| * | 匹配前一个字符0次或多次 | ab* | a, ab, abb |
| + | 匹配前一个字符1次或多次 | ab+ | ab, abb |
| ? | 匹配前一个字符0次或1次 | ab? | a, ab |
| {n} | 匹配前一个字符n次 | a{2} | aa (在字符串 "aaabbb" 中) |
| {n,} | 匹配前一个字符至少n次 | a{2,} | aa, aaa, aaaa (在字符串 "aaabbb" 中) |
| {n,m}| 匹配前一个字符n到m次 | a{2,4} | aa, aaa, aaaa (在字符串 "aaaaabbb" 中) |
| [] | 字符集,匹配方括号中的任意一个字符 | [abc] | a, b, c |
| [^] | 否定字符集,匹配不在方括号中的任意一个字符 | [^abc] | d, e, f, 1, 2, 3... |
| \d | 匹配一个数字字符。等价于 [0-9] | \d+ | 123, 456 |
| \D | 匹配一个非数字字符。等价于 [^0-9] | \D+ | abc, def |
| \w | 匹配一个字母、数字或下划线字符。等价于[a-zA-Z0-9_] | \w+ | abc, 123, def, 456 |
| \W | 匹配一个非字母、数字或下划线字符。 | \W | (如果有空格或特殊字符会匹配) |
| \s | 匹配一个空白字符(包括空格、制表符、换行符) | \s+ | (匹配字符串中的所有空格) |
| \S | 匹配一个非空白字符 | \S+ | abc123def456 |
| ^ | 匹配字符串的开头 | ^abc | abc (在字符串 "abc123def" 中) |
| $ | 匹配字符串的结尾 | def$ | def (在字符串 "abc123def" 中) |
| \| | 或,匹配 \| 两侧的任意一个表达式 | abc\|def | abc, def |
| () | 分组,将括号内的内容作为一个整体 | (ab)+ | ab, abab, ababab |

4. 常用函数

  • re.match(pattern, string, flags=0):尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。

    python
    result = re.match(r'hello', 'hello world')
    if result:
    print(result.group()) # 输出 hello

  • re.search(pattern, string, flags=0):扫描整个字符串并返回第一个成功的匹配。

    python
    result = re.search(r'world', 'hello world')
    if result:
    print(result.group()) # 输出 world

  • re.findall(pattern, string, flags=0):找到 RE 匹配的所有子串,并将它们作为一个列表返回。

    python
    result = re.findall(r'\d+', 'abc123def456')
    print(result) # 输出 ['123', '456']

  • re.sub(pattern, repl, string, count=0, flags=0):替换字符串中的匹配项。repl 可以是字符串或函数。

    python
    result = re.sub(r'\d+', '***', 'abc123def456')
    print(result) # 输出 abc***def***

  • re.split(pattern, string, maxsplit=0, flags=0): 通过 pattern 分割字符串, 返回分割后的字符串列表。

    python
    result = re.split(r'\s+', 'hello world how are you')
    print(result) # 输出 ['hello', 'world', 'how', 'are', 'you']

5. 贪婪与非贪婪

默认情况下,*, +, ? 等限定符都是贪婪的,它们会尽可能多地匹配文本。例如:

python
result = re.search(r'a.*b', 'aabab')
print(result.group()) # 输出 aabab

*, +, ? 等限定符后面加上 ?,可以使其变成非贪婪的,即尽可能少地匹配文本。

python
result = re.search(r'a.*?b', 'aabab')
print(result.group()) # 输出 aab

6. 标志位 (flags)

常用的标志位有:

  • re.I (IGNORECASE): 忽略大小写
  • re.M (MULTILINE): 多行模式,影响 ^$ 的行为
  • re.S (DOTALL): 点 . 匹配包括换行符在内的所有字符

python
result = re.findall(r'abc', 'ABCdef', flags=re.I)
print(result) # 输出 ['ABC']

7. 总结

恭喜你!你已经在10分钟内掌握了Python正则表达式的基础知识。记住,实践是学习的关键。多尝试使用不同的正则表达式来解决实际问题,你就能更快地掌握它们。

这只是入门,正则表达式还有很多高级用法,例如零宽断言、回溯引用等。如果你感兴趣,可以继续深入学习。希望这篇文章能帮助你打开正则表达式的大门!

THE END