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正则表达式的基础知识。记住,实践是学习的关键。多尝试使用不同的正则表达式来解决实际问题,你就能更快地掌握它们。
这只是入门,正则表达式还有很多高级用法,例如零宽断言、回溯引用等。如果你感兴趣,可以继续深入学习。希望这篇文章能帮助你打开正则表达式的大门!