Python——正则表达式 - 详解

类别

概念/符号

说明与示例

​元字符与特殊序列​

.

匹配​​除换行符外​​的任意​​单个​​字符

示例:a.b可匹配 "aab", "acb" 等

^

匹配字符串的​​开始​​。示例:^Hello匹配以 "Hello" 开头的字符串

$

匹配字符串的​​结束​​。示例:end$匹配以 "end" 结尾的字符串

``

​转义​​特殊字符,使其表示字符本身。例如 \.匹配真正的点号,\\匹配反斜杠

\|

​或​​操作,匹配两侧的任意一个表达式。示例:cat\|dog匹配 "cat" 或 "dog"

​量词(重复次数)​

*

匹配前一个字符​​0次或多次​​。示例:go*d匹配 "gd", "god", "good"

+

匹配前一个字符​​1次或多次​​。示例:go+d匹配 "god", "good"

?

匹配前一个字符​​0次或1次​​。示例:colou?r匹配 "color" 或 "colour"

{m,n}

匹配前一个字符​​至少m次,至多n次​​。示例:a{2,4}匹配 "aa", "aaa", "aaaa"

​字符集合与范围​

[abc]

匹配​​方括号内任意一个字符​​。示例:[aeiou]匹配任意小写元音字母

[a-z]

匹配​​指定范围内的任意一个字符​​。示例:[0-9]匹配任意数字

[^abc]

​否定​​字符集合,匹配​​不在​​方括号内的任意一个字符

\d

匹配任意​​数字​​,等价于 [0-9]

\D

匹配任意​​非数字​​字符

\w

匹配​​字母、数字、下划线​​,等价于 [a-zA-Z0-9_]

\W

匹配​​非字母、数字、下划线​​的字符

\s

匹配任意​​空白字符​​(空格、制表符、换行符等)

\S

匹配任意​​非空白​​字符

​边界匹配(位置)​

\b

匹配一个​​单词的边界​​(开头或结尾)。示例:\bhello\b匹配独立的单词 "hello"

\B

匹配​​非单词边界​

​分组与捕获​

( )

​捕获分组​​,将括号内的模式作为一个整体,并提取匹配的内容。示例:(\d{4})可捕获四位数字

(?: )

​非捕获分组​​,只分组但不捕获内容,用于提高效率或逻辑分组

(?P<name>)

​命名分组​​,为分组起名,可通过名称引用。示例:(?P<year>\d{4})匹配并命名一个四位数的年份

​正则标志​

re.IGNORECASE(re.I)

​忽略大小写​​进行匹配

re.MULTILINE(re.M)

​多行模式​​,使 ^和 $匹配​​每一行​​的开头和结尾,而不仅仅是整个字符串的开头和结尾

re.DOTALL(re.S)

使元字符 .匹配​​包括换行符在内​​的所有字符

re模块

有了准备知识,我们就可以在Python中使用正则表达式了。Python提供re模块,包含所有正则表达式的功能。

先看看如何判断正则表达式是否匹配(此处忽略手残打错的代码):

切分字符串

用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:

这里并不能正常识别到连续的空格,用正则表达式试试

分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。

注意到group(0)永远是与整个正则表达式相匹配的字符串,group(1)group(2)……表示第1、2、……个子串。

贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0

练习

请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:

  • someone@gmail.com
  • bill.gates@microsoft.com
import re
def is_valid_email(addr):
    return True
# 测试:
assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')
print('ok')

版本二可以提取出带名字的Email地址:

  • <Tom Paris> tom@voyager.org => Tom Paris
  • bob@example.com => bob
import re
def name_of_email(addr):
    return None
# 测试:
assert name_of_email(' tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')

posted @ 2026-02-13 18:30  clnchanpin  阅读(13)  评论(0)    收藏  举报